2016-01-12 254 views
0

我試圖在python中使用Pandas的df.to_sql和SQlite3將大約2GB的數據與大約1600萬行的數據放在一起。我的策略是將原始CSV分塊爲更小的數據框,對它們執行一些操作,然後將它們放入SQL數據庫中。Python和Pandas在添加大量數據時SQLite3速度變慢

當我運行這個代碼時,它開始快速,但很快就會變慢。在大約300萬行之後,它會減慢到這樣的程度,因爲它似乎不會在任何實際的時間內完成。這是什麼原因,我能做些什麼呢?我的代碼如下:

def chunk_read_CSV_to_db(database, table, filepath, chunksize, delimiter=','): 
    start = dt.datetime.now() 
    conn = sqlite3.connect(database) 
    index_start = 1 
    j=0 
    for df in pd.read_csv(filepath, chunksize=chunksize, iterator=True, encoding='utf-8', sep=delimiter): 
     j+=1 
     print '{} seconds: complete {} rows'.format((dt.datetime.now() -start).seconds, j*chunksize) 
     df.to_sql(name=table, con=conn, flavor='sqlite', if_exists='append') 
    conn.close() 

db_name = 'store_data.db' 
f9 = 'xrf_str_geo_ta4_1511.txt' 
chunksize = 20000 
chunk_read_CSV_to_db(os.path.join(fp, db_name), os.path.splitext(f9)[0], os.path.join(fp, f9), chunksize = chunksize, delimiter='\t') 
+2

做什麼?刪除索引,添加數據並在之後創建索引是明智的。請參閱http://stackoverflow.com/questions/788568/sqlite3-disabling-primary-key-index-while-inserting –

回答

0

我切換到sqlalchemy並沒有問題,隨後的時間。沒有明顯的放緩。代碼如下。

def chunk_read_CSV_to_db(database, table, filepath, chunksize, delimiter=',', index=False): 
    start = dt.datetime.now() 
    index_start = 1 
    j=0 
    for df in pd.read_csv(filepath, chunksize=chunksize, iterator=True, encoding='utf-8', sep=delimiter): 
     j+=1 
     print '{} seconds: complete {} rows'.format((dt.datetime.now() -start).seconds, j*chunksize) 
     df.to_sql(table, db, flavor='sqlite', if_exists='append', index=index) 

db = create_engine('sqlite:///store_data.db') 
meta = MetaData(bind=db) 

table_pop = Table('xrf_str_geo_ta4_1511', meta, 
    Column('TDLINX',Integer, nullable=True), 
    Column('GEO_ID',Integer, nullable=True), 
    Column('PERCINCL', Numeric, nullable=True) 
) 

chunksize = 20000 
chunk_read_CSV_to_db(db,'xrf_str_geo_ta4_1511', os.path.join(fp, f9), chunksize = chunksize, delimiter='\t')   
0

所以我知道這個答案將不再是相關的作者,但我通過它絆倒了,因爲我有完全相同的問題,並希望分享我的答案。

我正試圖使用​​append方法逐個加載〜900個.csv文件到一個sql數據庫中。加載開始的很快,但成倍下降,從未完成運行。這讓我懷疑索引編制有問題(即每次我追加數據時,熊貓都會重新編制索引),因爲這是我能想到解釋放緩(內存似乎很好)的唯一方法。

最後,我通過命令行開始使用sqlite3 .index和.dbinfo方法來查看通過pandas創建的數據庫,與通過sqlite3直接比較的數據庫相比。我發現的是,當通過sqlite3進行處理時,熊貓數據庫有1個索引,而0則爲0。而且,模式大小也更大。

現在,pandas to_sql方法有一個索引參數。它說這個參數只是將數據幀索引作爲數據庫中的一列添加(這聽起來足夠無害)。但事實證明,它也將該列用作數據庫索引,並且似乎如果您使用append方法,那麼可能每次(或某物)重新計算此索引。無論如何,當我將索引參數設置爲False時,.dbinfo在結果數據框中顯示0個索引,並且我的問題消失了 - 所有數據都在很短的時間內處理完畢。

因此,解決辦法是:你必須在你的表中的任何索引

df.to_sql(name=table, con=conn, flavor='sqlite', if_exists='append', index = False) 
相關問題