据我了解,HDFStore.select
是用于从大型数据集中进行选择的工具。但是,当尝试使用chunksize
and循环块时iterator=True
,一旦基础数据集足够大,迭代器本身就会变成一个非常大的对象,我不明白为什么迭代器对象很大以及它包含什么样的信息它必须变得这么大。
我有一个非常大的HDFStore
结构(70 亿行,420 GB 磁盘),我想按块进行迭代:
iterator = HDFStore.select('df', iterator=True, chunksize=chunksize)
for i, chunk in enumerate(iterator):
# some code to apply to each chunk
当我为一个相对较小的文件运行此代码时 - 一切正常。但是,当我尝试将其应用于 70 亿行数据库时,我得到了一个Memory Error
when 计算迭代器。我有 32 GB 内存。
我想要一个生成器来在旅途中创建块,它不会在 RAM 中存储太多,例如:
iteratorGenerator = lambda: HDFStore.select('df', iterator=True, chunksize=chunksize)
for i, chunk in enumerate(iteratorGenerator):
# some code to apply to each chunk
但iteratorGenerator
不可迭代,所以这也不起作用。
我可能会循环HDFStore.select
overstart
和stop
rows,但我认为应该有一种更优雅的迭代方式。