我有多个(〜50个)大型csv文件(每个〜1至5gb),我想合并成一个大的csv文件。 我使用dask创建了一个循环,该循环打开每个csv并调用merge,然后在循环结束时将所有内容保存到csv:
for i, file in enumerate(files):
table = dd.read_csv(file)
if i == 0:
merged = table
else:
merged = dd.merge(merged, table, on = ["id", "time", "key"])
merged.to_csv("merged\merged1810_*.csv")
但是,这样做会产生MemoryError
。
尽管我应该让Dask进行块计算以避免这些类型的错误,但是我的数据太大了,Dask无法处理吗? 有没有更好的办法解决这个问题?
答案 0 :(得分:0)
您需要完全合并/联接,还是需要一个简单的concat?
df = dd.read_csv(files)
完全并行执行合并/连接可能非常昂贵,尤其是在内存不足的情况下。很少有人会像这样反复地合并/合并许多数据框。我怀疑dd.read_csv
或dd.concat
可能是更好的解决方案。 (尽管我不知道您的申请)
答案 1 :(得分:0)
您是否了解文件/数据的组织方式或完全随机?
例如,您是否可以轻松地将csv文件重新排列成几个文件,例如每个文件(id,key)都重复排列一次? 然后,您可以依次合并每个文件并追加到更大的文件中?假设每个“分区”都适合内存。
如果您没有太多(id,key)对,这可能是可管理的。我遇到了类似的问题,最终做了类似的事情,并与dask并行。可能不是最高效/最漂亮的,但它完成了工作...
希望有帮助,
欢呼