2016-04-24 54 views
1

我想向數據庫添加大約7億行和2列。使用下面的代碼:如何減少在python中追加SQL數據庫的時間

disk_engine = create_engine('sqlite:///screen-user.db') 
chunksize = 1000000 
j = 0 
index_start = 1 

for df in pd.read_csv('C:/Users/xxx/Desktop/jjj.tsv', chunksize=chunksize, header = None, names=['screen','user'],sep='\t', iterator=True, encoding='utf-8'): 
    df.to_sql('data', disk_engine, if_exists='append') 
    count = j*chunksize 
    print(count) 
    print(j) 

它需要很長時間(我估計它需要幾天)。有沒有更有效的方法來做到這一點?在R中,我一直使用data.table包加載大型數據集,只需要1分鐘。 Python中是否有類似的包?作爲一個切點,我想將這個文件實際存儲在我的桌面上。現在,我假設'數據'被存儲爲臨時文件。我將如何做到這一點?

此外,假設我將數據加載到數據庫中,我希望查詢在一分鐘或更短時間內執行。這裏是什麼,我想用Python + SQL做一些僞代碼:

#load data(600 million rows * 2 columns) into database 
#def count(screen): 
    #return count of distinct list of users for a given set of screens 

從本質上講,我回到屏幕的數量爲一組給定users.Is的數據太大了,這個任務?我也想把這個表與另一個表合併。 R中fread函數的速度要快多少?

+1

困擾,所以你正在使用SQLite。至於你的問題「是否有與R數據表等價的Python」。熊貓是那個圖書館。你的代碼的慢部分是數據庫寫入。你不能從'df'變量本身來計算不同的用戶嗎?你爲什麼需要SQL? –

+0

我認爲數據庫執行查詢會更快。作爲python的新用戶,我將如何查看df的記錄?如果我打印(DF),我得到的對象名稱,我認爲寫數據到SQL數據庫將更容易編寫查詢方面,我也可以查看我的表的輸出。另外,我不知道在我的pd.read_csv語句中加載數據需要多長時間。 – zorny

+0

在SQL中編寫查詢本身可能會容易很多,是的,但正如您發現的那樣,將數據加載到數據庫中很慢。就個人而言,我建議你看看[SparkSQL](http://spark.apache.org/docs/latest/sql-programming-guide.html#overview),並擔心後面寫入數據庫文件。 –

回答

1

如果您的目標是將數據從您的TSV文件導入到SQLite中,您應該嘗試SQLite本身的本地導入功能。只要打開sqlite控制檯程序,做這樣的事情:

sqlite> .separator "\t" 
sqlite> .import C:/Users/xxx/Desktop/jjj.tsv screen-user 

不要忘記做任何查詢之前建立適當的索引。

+1

對於MySQL來說也是一樣,順便說一句。只需讓數據庫通過導入整個文件來處理導入。我已經在合理的時間(幾十分鐘)內用多GB文件完成了這項工作。 – roadrunner66

0

正如@John Zwinck已經說過的,您應該使用原生RDBMS的工具來加載這些數據量。

首先,我認爲SQLite並不是適用於700萬行的適當工具/數據庫,特別是如果您想在此後加入/合併此數據。

根據您在加載後想要對數據執行的處理類型,我將使用free MySQL或者如果您負擔得起集羣 - Apache Spark.SQL並且在多個集羣節點上並行處理您的數據。

爲了將您的數據加載到MySQL DB中,您可以並應該使用本機LOAD DATA工具。

這裏是展示如何優化數據加載過程的MySQL(對於不同:MySQL的版本中,MySQL選項,MySQL的存儲引擎:MyISAM和InnoDB等)great article

結論:使用本地數據庫的工具用於高效加載大量的CSV/TSV數據而不是熊貓,特別是如果您的數據不適合內存,並且您想要在加載後處理(加入/合併/過濾/等)您的數據。

+0

使用MySQL加載數據後,是否可以通過python/pandas輕鬆與該數據庫進行交互?如果您只使用筆記本電腦,Spark也有用嗎? – zorny

+0

@zorny,不,這個想法是你不想使用熊貓,除非你想要處理的所有數據都適合內存,或者你可以輕鬆地處理(連接,分組,彙總,過濾等)你的數據使用熊貓的塊,這是很少的情況。 – MaxU

+0

@zorny,在一臺機器/筆記本電腦上使用Spark沒有什麼意義,也許只是爲了學習它......如果您沒有其他選擇,並且必須在筆記本電腦上處理所有數據,則可以嘗試直接執行在MySQL中 - 它被設計用於處理關係數據;) – MaxU