如何在没有足够内存的情况下使用 Pandas 打开大型 Parquet 文件

9
我正在尝试使用Pandas中的read_parquet函数将一个相当大的Parquet文件(大约30百万行,大小为2 GB)读入我的Python 3 Jupyter笔记本中。我已经安装了pyarrowfastparquet库,它们是read_parquet函数用于parquet文件的引擎。可惜,在读取时,我的计算机会冻结,最终出现内存不足的错误(我不想重复运行代码,因为这会导致另一次冻结,我不知道确切的错误消息)。
是否有一个好方法在不发生这种情况的情况下将Parquet文件的某部分写入内存?我知道Parquet文件是按列排列的,可能无法仅将部分记录存储到内存中,但如果有解决方法或者查看我在读取时是否做错了什么,我希望能够拆分它。
我的计算机配置相对较弱,只有6 GB的内存和i3处理器。处理器主频为2.2 GHz,支持Turbo Boost。
3个回答

6

可以批量读取parquet数据

  • 读取特定的行组或迭代行组
  • 仅读取特定列

这样可以减少内存占用。fastparquet和pyarrow都支持此功能。

在使用pyarrow时,可以使用iter_batches从Parquet文件中读取流式批处理数据。

import pyarrow.parquet as pq
parquet_file = pq.ParquetFile('example.parquet')
for i in parquet_file.iter_batches(batch_size=1000):
    print("RecordBatch")
    print(i.to_pandas())

上面的例子只是每次读取1000条记录。您可以进一步将其限制为某些行组或甚至某些列,如下所示。
for i in parquet_file.iter_batches(batch_size=10, columns=['user_address'], row_groups=[0,2,3]):

3

你需要所有的列吗?你可以只加载你实际使用的列来节省内存。

第二种可能性是使用在线机器(例如 Google Colab)来加载parquet文件,然后将其保存为hdf格式。一旦你拥有了它,你就可以分块使用它。


2

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