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

hgc7kmma  于 2022-10-23  发布在  其他
关注(0)|答案(3)|浏览(221)

我正在尝试使用Pandas read_parquet函数将一个相当大的Parquet文件(~2GB,约3000万行)读入我的Jupyter Notebook(在Python 3中)。我还安装了pyarrowfastparquet库,read_parquet函数将其用作Parquet文件的引擎。不幸的是,在阅读时,我的电脑似乎会冻结,最终我会收到一个错误,说内存不足(我不想重复运行代码,因为这会导致另一次冻结-我不知道逐字错误消息)。
有没有一种好方法可以在不发生这种情况的情况下将Parquet文件的某些部分写入内存?我知道Parquet文件是柱状的,可能不可能只将一部分记录存储到内存中,但如果有解决方法,或者可能在尝试读入时发现我是否做错了什么,我想可能将其拆分。
我确实有一台性能相对较弱的电脑,只有6 GB内存和i3。CPU为2.2 GHz,可使用Turbo Boost。

yeotifhr

yeotifhr1#

你需要所有的柱子吗?您可以通过加载实际使用的内存来节省内存。
第二种可能性是使用在线机器(如google colab)加载Parquet文件,然后将其保存为hdf。一旦您拥有了它,就可以将其分块使用。

5q4ezhmt

5q4ezhmt2#

你可以用Dask代替Pandas。它是建立在Pandas上的,所以有类似的API,你可能会很熟悉,而且是为了更大的数据。
https://examples.dask.org/dataframes/01-data-access.html

cwxwcias

cwxwcias3#

可以读取Parquet数据

  • 批次
  • 读取某些行组或遍历行组
  • 只读某些列

这样可以减少内存占用。fastparquet和pyarrow都应该允许你这样做。
在pyarrow的情况下,iter_batchs可用于从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]):

相关问题