2016-06-10 24 views
4

我正在从两个需要加入的不同数据库中下载两个数据集。当我将它们存储为CSV时,它们各自分别大约为500MB。另外适合内存,但是当我加载我有时会得到一个内存错误。当我尝试将它们与熊猫合并时,我肯定会陷入麻烦。在熊猫中加入两个大型数据集的最佳方法

对它们进行外连接的最佳方法是什么,以便我不会出现内存错误?我手边没有任何数据库服务器,但如果有帮助,我可以在我的计算机上安装任何类型的开源软件。理想情况下,我仍然只想用熊猫解决它,但不知道这是否可能。

澄清:合并我的意思是一个外连接。每个表格有两行:产品和版本。我想检查哪些产品和版本只在左侧表格中,仅在右侧表格和两个表格中。我用

pd.merge(df1,df2,left_on=['product','version'],right_on=['product','version'], how='outer') 
+0

什么操作系统你在跑吗? – user2027202827

+0

请更详细地说明你期望这个程序做什么,以及这个连接应该在哪些领域工作。在最好的情况下,您可以将两个CSV文件合并(逐行)。此外,如果您可以发布导致内存错误的代码,这将有很大帮助。 –

+0

我对原始问题添加了更多详细信息 – Nickpick

回答

4

这似乎是dask的设计目的。本质上,dask可以在核心外执行pandas操作,因此您可以使用不适合内存的数据集。 dask.dataframe API是pandas API的子集,所以不应该有太多的学习曲线。请参阅Dask DataFrame Overview页面了解一些其他DataFrame特定细​​节。

import dask.dataframe as dd 

# Read in the csv files. 
df1 = dd.read_csv('file1.csv') 
df2 = dd.read_csv('file2.csv') 

# Merge the csv files. 
df = dd.merge(df1, df2, how='outer', on=['product','version']) 

# Write the output. 
df.to_csv('file3.csv', index=False) 

假设'product''version'是唯一列,它可能是更有效的替代merge有:

df = dd.concat([df1, df2]).drop_duplicates() 

我不完全知道这会更好,但显然合并没有在索引上完成的是dask中的“慢速”,所以它可能值得一试。

+0

很好,但如果df1不适合内存呢? – Nickpick

+2

这就是'dask'的全部要点。它在核外进行操作,因此您可以使用不适合内存的数据。它本质上将方便数据集的大小从“适合内存”扩展到“适合磁盘”。 – root

+0

有没有办法做大型数据框的数据透视表? Dask似乎没有提供这种功能 – Nickpick

2

我会建议你使用RDBMS如MySQL为...

所以,你会需要load your CSV files into tables第一。

之后,你可以执行你的检查:

哪些产品和版本左表中的唯一

SELECT a.product, a.version 
FROM table_a a 
LEFT JOIN table_b b 
ON a.product = b.product AND a.version = b.version 
WHERE b.product IS NULL; 

产品及其版本是在正确的表中只有

SELECT b.product, b.version 
FROM table_a a 
RIGHT JOIN table_b b 
ON a.product = b.product AND a.version = b.version 
WHERE a.product IS NULL; 

in

SELECT a.product, a.version 
FROM table_a a 
JOIN table_b b 
ON a.product = b.product AND a.version = b.version; 

Configure your MySQL Server,以便它使用至少2GB的RAM

您可能还需要使用MyISAM引擎你的表,在这种情况下检查this

它可能工作比较慢相比,大熊猫,但你绝对赢没有内存问题。

另一种可能的解决方案:

  • 增加你的RAM上的多个群集节点
  • 使用Apache星火SQL(分布式数据帧) - 它会便宜很多,虽然增加你的RAM
+0

谢谢你,但为什么操作系统不能扩展内存与硬盘空间? – Nickpick

+0

通常应该是可能的(至少对Windows和Linux,我没有Mac OS的经验),但它是非常无效 – MaxU

+0

我使用Windows,它显然不使用我的SSD高清作为扩展 – Nickpick

相关问题