【问题标题】:Fastest way to read complex data structures from disk in Python在 Python 中从磁盘读取复杂数据结构的最快方法
【发布时间】: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。

【问题讨论】:

标签: python python-3.x pandas pickle


【解决方案1】:

这可能与this 问题重复

HDF5 在处理嵌套的 pandas 数据帧方面要快得多。我会试一试。

here 借用的示例用法显示了在转储时如何有效地对其进行分块:

import glob, os
import pandas as pd

df = DataFrame(np.random.randn(1000,2),columns=list('AB'))
df.to_hdf('test.h5','df',mode='w',format='table',data_columns=True)
store = pd.HDFStore('test.h5')
nrows = store.get_storer('df').nrows
chunksize = 100
for i in xrange(nrows//chunksize + 1):
    chunk = store.select('df',
                         start=i*chunksize,
                         stop=(i+1)*chunksize) 
store.close()

回读时,你也可以像这样分块进行:

for df in pd.read_hdf('raw_sample_storage2.h5','raw_sample_all', start=0,stop=300000,chunksize = 3000):
    print df.info()
    print(df.head(5))

【讨论】:

  • 这应该是评论。
  • @Mohit Motwani 同意,但我不确定该评论是否对格式友好。我应该删除这个答案吗?
  • 您现在已经编辑了答案,这可能对 OP 有所帮助。所以你不必删除它:}
猜你喜欢
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 2010-11-08
  • 2015-05-29
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 2020-04-14
相关资源
最近更新 更多