Страницы

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

вторник, 28 января 2020 г.

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

#python #память #список


Есть текстовый файл list.txt, состоящий из строк вида:

name1
name2
name3
name4
name5
...


Файл на диске занимает 196 МБ.

При загрузке его следующим методом:

L = []
F = open('list.txt')
L = F.readlines()
F.close()


оперативная память, занимаемая процессом становится порядка 1,3 ГБ.

Помогите разобраться, почему такой прирост использования памяти относительно файла
на диске?
    


Ответы

Ответ 1



>>> 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 генераторы и т.д.

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

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