在Python中读取parquet时内存使用率过高

Sym*_*ger 5 python memory-management parquet pyarrow

我有一个大约 10+GB 的镶木地板文件,列主要是字符串。加载到内存时,内存占用最高可达110G,加载完毕后,内存占用又回落至40G左右。

我正在使用分配了内存的高性能计算机,因此我确实可以访问大内存。不过,仅仅为了加载数据就必须申请128G内存,这对我来说似乎有点浪费,之后64G就足够了。另外,128G内存更容易出现故障。

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

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

Wes*_*ney 2

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

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

我们还引入了一个选项,可以将字符串列读取为分类(也称为DictionaryArray箭头用语),这也将减少内存使用量。请参阅https://issues.apache.org/jira/browse/ARROW-3325和讨论

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