长话短说,我一直在努力解决内存问题(以及执行时间)dask
/ pandas
以编写大型数据帧to_sql
或to_csv
如果有人能指出我正确的方向(下面有更多详细信息)?
为了节省内存,而不是使用dask
,我将两个大的.csv文件一起附加在一起,以pandas
组成一个更大的.csv文件(27M行x 52列)。内存不足或即将耗尽。
从那里,我只是试图写一个.csv
,但是我又一次耗尽了内存,试图使用.compute()
将dask数据框转换为pandas数据框并写入文件。我想将这个问题集中在如何在不耗尽内存的情况下将其简单地放入.csv中。从那里,我计划使用SQL Server的导入向导将文件导入数据库中的新表。请参阅下面的代码,以了解如何将我读为concat
并作为一个dask数据帧,转换为pandas数据帧,然后在内存不足之前尝试写入.csv:
df1 = dd.read_csv('C:/Users/david.erickson/file1.csv',dtype={'Phone #': str,'Called #': str})
df2 = dd.read_csv('C:/Users/david.erickson/file2.csv','Called #': str})
df_combined = dd.concat([df1,df2],axis=0).drop_duplicates()
df_combined = df_combined.compute()
df_combined.to_csv('C:/Users/david.erickson/file_combined.csv',index=False)
在观看python接近38 GB的承诺物理内存后,我在第四行或第五行遇到内存错误:
MemoryError: Unable to allocate 210. MiB for an array with shape (27571126,) and data type int64
在任何人提到它之前,我还孜孜不倦地尝试to_sql
,但也没有成功,因为最终目的是将这些数据放入SQL Sever数据库中。它会永远占用时间,并且我遇到sqlalchemy
的{{1}}导致的内存错误。更好的是,我希望我可以直接写到SQL Server,这就是我尝试过的:
to_sql
我还尝试了:engine = sa.create_engine(cnxn_string,fast_executemany=True)
connection = engine.connect()
df.to_sql('New_Table',con=engine,if_exists='replace',index=False)
#限制了2098个参数,这就是为什么chunksize = 40(40 * 52列= 2080,因此小于限制)的原因。总之,这比仅通过比较慢df6.to_sql('New_Table',index=False,chunksize=40,method='multi')
至fast_executemany=True
不幸的是,上述尝试以及我用create_engine)
研究的其他python sqlalchemy
方法用完了内存或该操作花费了整夜(一夜之间),我不得不将其杀死。
在52列和2750万行中,我想每个单元的平均字符串大小约为20个字符(至少对于文本列而言)。为了使这些数据进入SQL Server数据库,我必须做一些不同的事情,但是我确实在为这个项目提供更多数据之前从未遇到过.to_sql
或to_sql
的问题。 / p>