#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 генераторы и т.д.
Комментариев нет:
Отправить комментарий