500 МБ данных JSON не приводит к использованию 500 МБ памяти. Это приведет к кратности этого. Именно по тому, какой фактор зависит от данных, но коэффициент 10-25 не является чем-то необычным.
Например, следующий простой JSON строка из 14 символов (байтов на диске) приводит объект Python почти в 25 раз больше (Python 3.6b3):
>>> import json
>>> from sys import getsizeof
>>> j = '{"foo": "bar"}'
>>> len(j)
14
>>> p = json.loads(j)
>>> getsizeof(p) + sum(getsizeof(k) + getsizeof(v) for k, v in p.items())
344
>>> 344/14
24.571428571428573
Это потому, что объекты Python требуют некоторые накладные расходы ; экземпляры отслеживают количество ссылок на них, тип их и их атрибуты (если тип поддерживает атрибуты) или их содержимое (в случае контейнеров).
Если вы используете json
встроенную библиотеку, чтобы загрузить этот файл, он будет строить большие и большие объекты содержимого, как они обрабатываются, и в какой-то момент операционная система будет отказывать в предоставлении более Память. Это не будет на 32 ГБ, потому что есть ограничение за процесс сколько памяти можно использовать, поэтому вероятность того, что будет 4 ГБ. В этот момент все те объекты, которые уже созданы, снова освобождаются, поэтому в конечном итоге фактическое использование памяти не должно сильно измениться.
Решение состоит в том, чтобы разбить этот большой файл JSON на более мелкие подмножества или использовать парсер JSON, управляемый событиями, например ijson
.
Парсер JSON, управляемый событиями, не создает объекты Python для всего файла, только для текущего обработанного элемента, и уведомляет ваш код для каждого элемента, который он создал с событием (например, «запуск массива» string, теперь начиная отображение, это конец отображения и т. д.). Затем вы можете решить, какие данные вам нужны, и что следует игнорировать. Все, что вы игнорируете, снова отбрасывается, а использование памяти остается низким.
какая ОС вы используете? – Alex
Windows 10, и я использую Spyder для кодирования и выполнения. –
Если вы используете x32 python, вы ограничены объемом 4 ГБ на каждый процесс. Вероятно, вы достигли этого предела. – Alex