【问题标题】:Python Pycharm: Out of memory when loading large JSON filesPython Pycharm:加载大型 JSON 文件时内存不足
【发布时间】:2019-02-19 14:45:55
【问题描述】:

执行以下代码以加载多个大型 (~200MB) JSON 文件:

def work():
    jsons = get_data()
    # do something with the jsons

def get_data():
    json_files = []
    for json_path in file_paths_list:
        json_files.append(load_json(json_path))
    return json_files

def load_json(json_path):
    import json
    with open(json_path) as f:
        return json.load(f)

这是 Pycharm 的自定义 VM 选项的外观(最大 30GB 堆大小,RAM 为 32GB):

# custom PyCharm VM options

-Xms25000m
-Xmx30000m
...
...
...

已应用“使缓存无效/重新启动”的热门建议。

在加载 2 个文件(总共 ~400MB)后,在第 3 次,抛出异常“MemoryError”。

我不明白为什么如果我有高达 30GB 的堆大小,只有 400MB 之后就会引发内存错误?

【问题讨论】:

  • 因为加载到内存中的数据比文本文件本身占用更多的空间,因为所有元数据都添加到了对象中。例如,一个字符串比它的内容重。也就是说,30Gb 应该足够了
  • 你也用命令行python(64位)测试过。 Pycharm 不执行任何操作。如果您的 python 版本是 32 bt,那可能就是问题所在。
  • @Jean-FrançoisFabre 但仍然 - 它超过 30GB?很多。
  • 检查底层 python 解释器的版本。我敢打赌它是 32 位版本。

标签: python json pycharm out-of-memory


【解决方案1】:

PyCharm 是 Python IDE,而不是 Python 解释器。它使用的内存用于编辑阶段。

由于 python 对象的开销,400MB 的文件很可能会扩展到几 GB 的数据(可能不是 30,而是 3 或 4)。示例:

>>> s = "hello"
>>> import sys
>>> sys.getsizeof(s)
54

基本上ram中对象的大小远大于字符串的大小。

所以如果你的 python 解释器是 32 位解释器,你有 2GB 或 3GB 的限制,这可以解释这一点。 PyCharm 使用 64 位内核,但无法提供解释器部分的帮助。

升级到 64 位解释器,它可以利用您的所有 RAM。

您可以使用此(来自 Pycharm)检查版本信息和 32/64 位信息:

>>> import sys
>>> sys.version

例如我得到:

('3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:44:40) [MSC v.1600 64 bit '
 '(AMD64)]')

如果它显示“32 位”,我的猜测是正确的。所以卸载32位版本&只安装相同版本的python,但在64位,并选择它作为pycharm中的当前解释器。

您可能需要在新安装中安装额外的模块,所以最好在卸载之前使用dump the requirement textfile,以便能够在新的 64 位版本上执行全局 pip install

【讨论】:

  • 正确我有 32 个,想知道如何升级
  • 只安装相同版本的python,但在64位,并选择它作为pycharm中的当前解释器。为了更安全,请卸载 32 位版本。
  • 如果你只有 numpy 可以安装,这很容易。问题是当你不记得你真正需要的所有包时。
猜你喜欢
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多