【发布时间】:2013-05-13 05:58:14
【问题描述】:
我在磁盘中有数千个 csv 文件。它们每个的大小约为 ~10MB(~10K 列)。这些列中的大多数都包含实数(浮点)值。
我想通过连接这些文件来创建一个数据框。一旦我有了这个数据框,我想按前两列对其条目进行排序。
我目前有以下:
my_dfs = list()
for ix, file in enumerate(p_files):
my_dfs.append(
pd.read_csv(p_files[ix], sep=':', dtype={'c1' : np.object_, 'c2' : np.object_}))
print("Concatenating files ...")
df_merged= pd.concat(my_dfs)
print("Sorting the result by the first two columns...")
df_merged = df_merged.sort(['videoID', 'frameID'], ascending=[1, 1])
print("Saving it to disk ..")
df_merged.to_csv(p_output, sep=':', index=False)
但这需要太多内存,以至于我的进程在得到结果之前被杀死(在日志中我看到该进程在使用大约 10GB 内存时被杀死)。
我试图找出它到底在哪里失败,但我仍然无法做到(尽管我希望尽快记录标准输出)
在 Pandas 中有没有更好的方法来做到这一点?
【问题讨论】:
-
感谢@Nurgle 我以前没有使用过 SQLite。您对我如何将问题转移到它有任何指示吗?
-
1000s 个文件 * 10MB ~ 10GB,你有这么多可用内存吗?在这种情况下,可能更倾向于使用 db 排序。
-
你听说过heapq模块和归并排序吗? Guido 实现了这种方法来对大量文件进行排序。在这里查看neopythonic.blogspot.com/2008/10/…
-
@elyase。磁盘中的文本数据在连接时可能会占用多达 10GB,但我了解 Pandas 将 ASCII 浮点数转换为浮点类型,并且它可能有一种有效的机制来保存到磁盘。
-
这里有一个类似的问题:stackoverflow.com/questions/16110252/…