python - 在 Python 中读取 Parquet 时内存使用率过高

标签 python memory-management parquet pyarrow

我有一个大约 10+GB 的 Parquet 文件,列主要是字符串。加载到内存时,内存使用量最高可达110G,加载完成后,内存使用量减少到40G左右。

我正在使用分配了内存的高性能计算机,所以我可以访问大内存。然而,我觉得我为了加载数据而不得不申请128G的内存似乎很浪费,之后64G对我来说就足够了。另外,128G内存更经常出现故障。

我天真的猜想是 Python 解释器将 HPC 上的 512G 物理内存误认为是总可用内存,因此它不会像实际需要的那样频繁地进行垃圾收集。比如我用64G内存加载数据时,它从来没有给我抛出MemoryError,而是直接杀死内核并重新启动。

我想知道加载时内存使用率过高是否是pyarrow的常规行为,或者是由于我的环境的特殊设置。如果是后者,那么是否有可能在加载期间以某种方式限制可用内存?

最佳答案

我们修复了 0.14.0/0.14.1 中存在的内存使用错误(这可能是您现在正在使用的)。

https://issues.apache.org/jira/browse/ARROW-6060

我们还引入了一个选项来读取字符串列作为分类(在 Arrow 的说法中又名 DictionaryArray),这也将减少内存使用。见 https://issues.apache.org/jira/browse/ARROW-3325和讨论

https://ursalabs.org/blog/2019-06-07-monthly-report/

关于python - 在 Python 中读取 Parquet 时内存使用率过高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57436169/

相关文章:

json - 如何将 JSON 结果转换为 Parquet?

hadoop - 如何在 Parquet 模式定义中指定列描述

Python 连接和堆叠多个矩阵

python - 将字段附加到大小为 ONE 的结构化数组时出现 TypeError

python - 如何在 libusb 中切换 python 的后端?

c - C中局部变量的内存分配

c++ - 在SYCL中使用一个或多个缓冲区是否更有效?

python - 附加不存在的行数据时 pd.Crosstab 中的多索引出现问题

python - 为什么我的 python 2.7 进程使用大量内存?

hive - Parquet Hive 表中的架构演变