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