Python / JSON Размер загруженного объекта зависит от размера файла - PullRequest
1 голос
/ 27 апреля 2020

Недавно у меня были данные в файле users.json, загрузка которого в VsCode заняла много времени, так как файл был слишком большим (меня это удивило, потому что это был файл 29mb), я хотел использовать это шанс поиграть с использованием памяти питонов, я загрузил файл все в память, и он работал как ожидалось.

Хотя у меня есть вопрос, мне все больше нужно объяснение, простите, если его ответ слишком очевиден;

Когда я произвел самоанализ на загруженном json объекте Я обнаружил, что размер объекта (1.3mb) был намного меньше размера файла (29.6mb) в моей файловой системе (MacOS), как это могло быть? Разница в размерах слишком велика, чтобы ее игнорировать. Что еще хуже, у меня был файл меньшего размера, и этот файл возвращал результаты аналогичного размера (на диске / загружен, ~ 358kb), хаха.

import json

with open('users.json') as infile:
    data = json.load(infile)
    print(f'Object Item Count: {len(data):,} items \nObject Size: {data.__sizeof__():,} bytes)

Использование sys.getsizeof(data) вернет что-то похожее, может быть, с некоторыми gc накладными расходами.

Возвращает точный размер файла на диске (29586765 байт, 29mb)

from pathlib import Path

Path('users.json').stat().st_size

Пожалуйста, кто-нибудь может объяснить мне, что происходит, можно подумать, что там должно быть сходство по размеру или, может быть, я ошибаюсь.

1 Ответ

3 голосов
/ 27 апреля 2020

sys.getsizeof() не рекурсивно превращается в объекты:

Учитывается только потребление памяти, непосредственно связанное с объектом, а не потребление памяти объектами, к которым он относится .

Все строки, числа и т. Д. c. из файла JSON загружаются те вышеупомянутые "объекты, на которые ссылаются".

Для более точного результата вы можете

Тем не менее, некоторые объекты будут меньше в памяти, чем на диске; например, большое число, скажем, 36 << 921 - это 279 байт на диске, а sys.getsizeof() - это 148 байт в памяти. Точно так же достаточно умный JSON декодер (, который, на самом деле, встроенный json равен , а не , который по умолчанию JSON декодер на самом деле делает см. https://github.com/python/cpython/commit/7d6e076f6d8dd48cfd748b02dad17dbeb0b346a3) может делиться объектами для повторения клавиш dict.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...