Страницы

Поиск по вопросам

четверг, 28 марта 2019 г.

Загрузка списка из 200MB файла отбирает больше 1GB памяти. Почему такой прирост?

Есть текстовый файл list.txt, состоящий из строк вида:
name1 name2 name3 name4 name5 ...
Файл на диске занимает 196 МБ.
При загрузке его следующим методом:
L = [] F = open('list.txt') L = F.readlines() F.close()
оперативная память, занимаемая процессом становится порядка 1,3 ГБ.
Помогите разобраться, почему такой прирост использования памяти относительно файла на диске?


Ответ

>>> sys.getsizeof('hello') 54 >>> sys.getsizeof('h') 50 >>> sys.getsizeof('hellohello') 59 >>>
Вот пример из windows10 64 битная. Видно, что одна строка занимает 49 байт + 1байт на символ. Но! это ж UTF-8 строки и для кириллицы пойдет больше символов.
sys.getsizeof('Вася') 82 >>>
по формуле: 74 байта + 2 на символ. Теперь о затратах на хранение в списке. ЭТО на х64 винде: 40+8*количество_элементов байт. Пробуем сложить, считая что каждое имя ровно 5 символов:
16кк * ( (74 + 2*5) + 8) + 40 = 1 472 кк то есть ваши 1.3 Гига
Что делать? 1) посмотрите массивы numpy - они экономнее и по памяти и быстрее в работе. Думаю, массив numpy будет примерно 300кк памяти, так как он почти "фортрановский" :-) 2) Измените алгоритм так, чтобы не хранить в памяти весь список. Как правило это удается. Например чтение из файла используя yield генераторы и т.д.

Комментариев нет:

Отправить комментарий