在Python中从磁盘读取复杂数据结构的最快方法

时间:2019-01-07 17:00:12

标签: python python-3.x pandas pickle

我有一个CSV数据集,在一个字段中包含字符串形式的值列表,看起来像这样:

Id,sequence
1,'1;0;2;6'
2,'0;1'
3,'1;0;9'

在我正在处理的真实数据集中,序列长度差异很大,可以包含一个到数千个观测值。有很多列包含全部存储为字符串的序列。

我正在读取这些CSV并解析字符串,以使其成为嵌套在Pandas DataFrame中的列表。这需要一些时间,但我可以接受。

但是,稍后我将解析结果保存为pickle时,此pickle文件的读取时间非常长。

我面临以下问题:

  • 将这种结构的原始〜600mb CSV文件读取到熊猫大约需要3个小时 秒。
  • 从泡菜中读取相同的(原始的,未处理的)数据大约需要0.1秒。
  • 从泡菜中读取处理后的数据需要8秒钟!

我正在尝试找到一种以最快的方式从磁盘读取已处理数据的方法。

已经尝试:

  • 使用不同的存储格式进行实验,但是大多数不能存储嵌套结构。唯一有效的方法是msgpack,但性能并未提高很多。
  • 使用Pandas DataFrame以外的结构(例如元组的元组)时,性能会类似。

我对确切的数据结构不太感兴趣。问题是我想从磁盘直接将解析的数据直接读取到Python。

1 个答案:

答案 0 :(得分:0)

这可能是对this问题的重复

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

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))