仅读取特定行的最有效文件类型,在 python 中(非常大的文件)

Most efficient file type to read in only specific rows, in python (very large files)

我目前正在使用 parquet 文件,因为它们的读入时间很长。但是现在我希望稍微更改程序的功能。文件对于内存来说太大了,我希望只读取文件的特定行。

每个文件大约有 15GB 的数据(我将使用多个文件),有几百列和几百万行。如果我想阅读例如仅第 x 行,对其进行操作,然后读取新行(数百万次),执行此操作的最有效文件类型是什么?

我不太关心压缩,因为 ram 是我的限制因素,而不是存储。

提前感谢您的专业知识!

您很可能无法正确处理您的约会对象。如果原始数据存储为 CSV,则不仅可以节省调试时间,还可以使用以下方式将 CSV 转换为镶木地板:

更新2021.11.09

要逐行读取输入文件,您不需要任何花哨的格式,CSV 就足够了。通过使用 zstd.

压缩 CSV,您可能会在某些情况下(慢速 drive/slow NFS)得到改善

另一方面,我的建议是 运行 远离逐行处理大数据并使用数据帧。指定输入列的类型,找到具有分类值的列将允许您大大减少 RAM 需求。如果行的顺序不重要,您还可以对输入进行排序,这至少会提高压缩率。

从 parquet 将数据加载到数据框中比从 CSV/TSV 加载数据更快。 如果您仍会遇到内存不足错误,您可以使用 Linux split 将输入分成可管理的块并在需要时合并结果。

根据具体要求,我会查看:

请注意,Rocks DB 将在单个目录中生成多个文件,而不是单个文件。最后我看了看 Rocks DB 不支持二级索引,所以无论你为键做出什么选择,除非你想重写数据。 RocksDB 项目没有 python 绑定,但在 github.

上有一些浮动

SQLLite,至少,初始加载可能会很慢(我建议在初始加载后加载然后在“行号”上创建索引)。但它允许创建二级索引并通过这些索引合理有效地一次查找多行。