python - 在 dask 中合并多个大型数据框
问题描述
我有多个(约 50 个)大(每个约 1 到 5gb)csv 文件,我想将它们合并到一个大的 csv 文件中。使用 dask,我创建了一个循环,该循环打开每个 csv 并在循环结束时将所有内容保存到 csv 之前调用 merge:
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 无法处理?有没有更好的方法来解决这个问题?
解决方案
你知道你的文件/数据是如何组织的,还是完全随机的?
例如,您能否轻松地将您的 csv 文件重新排列为多个文件,例如,一个包含所有时间(id、key)的文件?然后您可以顺序合并每个文件并附加到更大的文件吗?假设每个“分区”都适合内存。
如果您没有太多 (id, key) 对,这可能是可以管理的。我遇到了类似的问题,最终做了类似的事情并与 dask 并行化。可能不是最有效/最漂亮的,但它完成了工作......
希望能帮助到你,
干杯
推荐阅读
- java - 不知道如何设置属性值(Java DOM Parser)
- typescript - 带有嵌套对象的 Object.keys():获取正确的类型
- sql - 使用 EXEC 的结果创建新表
- node.js - 如何使用 `ng new` 创建新应用程序?
- java - 如何在首选项中保存文件?
- c# - 如何使用 Sharppcap 获取 http 内容
- angular - 如何在 Ionic Angular 中播放音频?
- javascript - 您如何使用 Neptune 在本地进行测试?
- javascript - Javascript 中数组与对象的实例化。数组什么时候是对象,什么时候得到数组的方法?
- c++ - Mutex 不是 cv 的成员,用 g++ 编译失败