【发布时间】:2019-06-02 08:53:19
【问题描述】:
我有一个 CSV 数据集,其中包含值列表作为单个字段中的字符串,看起来或多或少像这样:
Id,sequence
1,'1;0;2;6'
2,'0;1'
3,'1;0;9'
在我处理的真实数据集中,序列长度变化很大,可以包含从一个到几千个观察值。有许多列包含所有存储为字符串的序列。
我正在读取这些 CSV 文件并将字符串解析为嵌套在 Pandas DataFrame 中的列表。这需要一些时间,但我可以接受。
但是,后来当我将解析结果保存到 pickle 时,这个 pickle 文件的读取时间非常长。
我面临以下问题:
- 将这种结构的原始 ~600mb CSV 文件读取到 Pandas 大约需要 ~3 秒。
- 从 pickle 读取相同的(原始的、未处理的)数据大约需要 0.1 秒。
- 从 pickle 读取处理后的数据需要 8 秒!
我正在尝试找到一种方法以最快的方式从磁盘读取处理过的数据。
已经试过了:
- 尝试不同的存储格式,但大多数都无法存储嵌套结构。唯一有效的是 msgpack,但它并没有提高性能。
- 使用 Pandas DataFrame 以外的结构(如元组的元组)- 面临类似的性能。
我对确切的数据结构不是很了解。问题是我想快速将解析后的数据从磁盘直接读取到 Python。
【问题讨论】:
-
你试过other formats that Pandas supports中的任何一个吗?
-
快速谷歌搜索显示其他人已经投入工作以评估不同的选项,请参阅matthewrocklin.com/blog/work/2015/03/16/Fast-Serialization、tech.blue-yonder.com/… 和ray-project.github.io/2017/10/15/… 示例;当前的建议似乎是use pyarrow。
-
“我正在读取那些 CSV 文件并将字符串解析为嵌套在 Pandas DataFrame 中的列表。”听起来对熊猫来说不是一个好的用例。注意,很多用于 pandas 的高性能序列化库不适用于
dtype=object,至少上次我检查过 -
你能“取消嵌套”数据结构吗?即为每个“序列”值重复“Id”值。将两列都设置为纯
ints 会使加载/保存更快,但显然应该与其他复杂性进行权衡......
标签: python python-3.x pandas pickle