大型Dask / Pandas DataFrame(27M行x 52列).to_csv或.to_sql MemoryError

长话短说,我一直在努力解决内存问题(以及执行时间)dask / pandas以编写大型数据帧to_sqlto_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_sqlto_sql的问题。 / p>

大型Dask / Pandas DataFrame(27M行x 52列).to_csv或.to_sql MemoryError

大型Dask / Pandas DataFrame(27M行x 52列).to_csv或.to_sql MemoryError

iCMS 回答:大型Dask / Pandas DataFrame(27M行x 52列).to_csv或.to_sql MemoryError

假设CSV具有类似主键的内容,请分割数据集。如果您有52列,则将其分成4帧和14列(每列4x 13,并复制主键列,以便您可以匹配它们),然后将较小的数据集传递给SQL。

或列出主键,仅插入前N个,提交事务,然后从下一批开始。

此外,MS SQL具有.csv的导入功能,由于它批量处理插入内容,因此效率相当高。为什么要使用python作为两者之间的层?

本文链接:https://www.f2er.com/2148693.html

大家都在问