HDFStore.select中的迭代器和块大小: "内存错误"

3
据我所知,HDFStore.select 是选择大数据集的主要工具。但是,在尝试使用 chunksizeiterator=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。
我希望能够创建一个生成器,实时生成块,它不会将太多数据存储在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 循环遍历到 startstop 行,但我认为应该有一种更优雅的迭代方式。
1个回答

2

我遇到了一个类似的问题,文件大小只有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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接