Python HDFStore.select中的迭代器和chunksize:";“内存错误”;

Python HDFStore.select中的迭代器和chunksize:";“内存错误”;,python,pandas,memory,iterator,hdfstore,Python,Pandas,Memory,Iterator,Hdfstore,据我所知,HDFStore.select是用于从大型数据集中进行选择的工具。但是,当尝试使用chunksize和iterator=True在块上循环时,一旦底层数据集足够大,迭代器本身就会变成一个非常大的对象,我不理解为什么迭代器对象很大,以及它包含什么样的信息,以至于它必须变得如此大 我有一个非常大的HDFStore结构(70亿行,磁盘上420 GB),我想按块进行迭代: iterator = HDFStore.select('df', iterator=True, chunksize=chu

据我所知,
HDFStore.select
是用于从大型数据集中进行选择的工具。但是,当尝试使用
chunksize
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亿行数据库时,在计算迭代器时会出现
内存错误。我有32GB内存

我希望有一个生成器在运行中创建块,它不会在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。在
start
stop
行上选择
,但我认为应该有一种更优雅的迭代方式。

我对一个(仅)30GB的文件也有同样的问题,显然你可以通过强制垃圾收集器完成它的工作来解决它。。。收集!:P PS:同样,您不需要lambda,select调用将返回一个迭代器,只需在其上循环,就像您在第一个代码块中所做的那样

with pd.HDFStore(file_path, mode='a') as store:
    # All you need is the chunksize
    # not the iterator=True
    iterator = store.select('df', chunksize=chunksize)

    for i, chunk in enumerate(iterator):

        # some code to apply to each chunk

        # magic line, that solved my memory problem
        # You also need "import gc" for this
        gc.collect()