【问题标题】:Create Dataframe in Pandas - Out of memory error while reading Parquet files在 Pandas 中创建数据框 - 读取 Parquet 文件时出现内存不足错误
【发布时间】:2020-11-26 05:17:48
【问题描述】:

我有一台配备 8 GB RAM 和 5 个内核的 Windows 10 机器。

我创建了一个用 gzip 压缩的 parquet 文件。压缩后的文件大小为 137 MB。 当我尝试通过 Pandas、dask 和 vaex 读取 parquet 文件时,我遇到了内存问题:

熊猫

df = pd.read_parquet("C:\\files\\test.parquet")
OSError: Out of memory: realloc of size 3915749376 failed

黎明

import dask.dataframe as dd
df = dd.read_parquet("C:\\files\\test.parquet").compute()
OSError: Out of memory: realloc of size 3915749376 failed

Vaex

df = vaex.open("C:\\files\\test.parquet")
OSError: Out of memory: realloc of size 3915749376 failed

由于 Pandas /Python 旨在提高效率,并且 137 mb 文件低于标准大小,有没有推荐的方法来创建高效的数据帧? Vaex、Dask 等库声称非常高效。

【问题讨论】:

  • 最新版本的 vaex (v4) 有了很大改进,不再支持 parquet 文件。 pip install vaex==4.0.0conda install -c conda-forge vaex==4。我认为这将解决您的许多问题。如果你这样做,请确保你暂时不要使用 python 3.9。

标签: pandas dataframe dask parquet vaex


【解决方案1】:

对于单机,我会推荐使用 HDF 文件格式的 Vaex。数据驻留在硬盘上,因此您可以使用更大的数据集。 vaex 中有一个内置的function,它可以读取更大的 csv 文件并将其转换为 hdf 文件格式。

df = vaex.from_csv('./my_data/my_big_file.csv', convert=True, chunk_size=5_000_000)

Dask 针对分布式系统进行了优化。您分块读取大文件,然后将其分散在工作机器中。

【讨论】:

  • “Dask 已针对分布式系统进行了优化” - 不正确,请参阅 docs.dask.org/en/latest/setup/single-machine.html
  • @mdurant 我没说过,dask 不支持单机。关键是 dask 是否支持在单机上加载核外数据?
  • 是的,确实如此,这就是它的目的(后来分发)
  • 您能指导我查看相关文档吗?因为上次我试图用 dask 加载一个大的 csv 文件;它因内存不足错误而崩溃;另外,我无法执行需要处理整个数据的过滤等操作。
  • 对不起,这是一个非常模糊的描述。有许多个变量。如果愿意,您可以发布有关您的情况的问题,或尝试任何 dask-dataframe 教程。
【解决方案2】:

由于 parquet 中的高效压缩和编码,137MB parquet 文件完全有可能在内存中扩展到 4GB。您可能有一些加载选项,请显示您的架构。您使用的是 fastparquet 还是 pyarrow?

由于您尝试使用的所有引擎都能够一次加载一个“行组”,我想您只有一个行组,因此拆分不起作用。您可以只加载选择的列以节省内存,如果这可以完成您的任务(所有加载器都支持这一点)。

【讨论】:

    【解决方案3】:

    检查您使用的是最新版本的 pyarrow。几次更新对我有帮助。

    pip install -U pyarrow

    【讨论】:

      猜你喜欢
      • 2017-10-03
      • 2015-07-27
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      相关资源
      最近更新 更多