【发布时间】:2016-10-27 22:25:26
【问题描述】:
我尝试使用 pandas 库读取 64 GB(用 blosc 压缩)的 HDF 文件。 Dataframe 包含 3 列和 11410996915 行。我正在尝试使用 pandas.read_hdf 方法和 where 参数按索引选择具体行。问题是有时我需要获取数千行,所以在我的 where 参数中我放了这样的内容:
simMat = pd.read_hdf('global.h5','matrix', columns=['similarity'], where='index in {}'.format(listIdx))
其中 listIdx 是表示我想要返回的索引的整数列表。当此列表包含超过 31 个元素时,我会收到内存错误。我开始查看 pandas 库的代码,发现在文件 pytables.py 中的 BinOp 类中有一个名为 _max_selectors 的变量,其赋值为 31。该变量在这段代码之后使用:
# if too many values to create the expression, use a filter instead
if self.op in ['==', '!='] and len(values) > self._max_selectors:
filter_op = self.generate_filter_op()
self.filter = (
self.lhs,
filter_op,
pd.Index([v.value for v in values]))
return self
过滤器的使用会导致库尝试加载整个数据帧,这会引发 MemoryError。我也尝试使用值为 10 的 chunksize 参数,但它也不起作用。你知道用这么大的索引集查询 HDF 文件的更好方法吗?
【问题讨论】:
标签: python pandas dataframe pytables