2016-06-10 51 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

相關問題