У меня проблема с памятью, которую я не могу понять.
Я нахожусь на 64-битной машине Windows с 8 ГБ памяти и запускаю 32-битную программу python.
Программы читают 5,118 зашифрованных numpy файлов (npz). Windows сообщает, что файлы занимают 1,98 ГБ на диске
Каждый файл npz содержит две части данных: 'arr_0' имеет тип np.float32 и 'arr_1' имеет тип np.uint8
Python script читает каждый файл, добавляет свои данные в два списка, а затем закрывает файл.
Вокруг файла 4284/5118 программа выдает исключение MemoryException
Однако диспетчер задач говорит, что использование памяти python.exe * 32 при возникновении ошибки составляет 1,854,848K ~ = 1,8 ГБ. Гораздо меньше, чем мой 8-гигабайтный лимит, или предполагаемый 4-гигабайтный предел 32-битной программы.
В программе я улавливаю ошибку памяти, и она сообщает: Каждый список имеет длину 4285. Первый список содержит в общей сложности 1,928,588,480 float32 ~ = 229,9 МБ данных. Второй список содержит 12 342 966 272 uint8 ~ = 1,471.3MB данных.
Итак, все, кажется, проверяется. За исключением части, где я получаю ошибку памяти. У меня больше памяти, и файл, с которым он падает, составляет ~ 800 КБ, поэтому он не пропустил чтение огромного файла.
Кроме того, файл не поврежден. Я могу прочитать его просто отлично, если я не буду использовать всю эту память заранее.
Чтобы сделать вещи более запутанными, все это, кажется, отлично работает на моей машине Linux (хотя у нее есть 16 ГБ памяти, а не 8 ГБ на моей Windows-машине), но, тем не менее, это, похоже, не машина ОЗУ, которая вызывает эту проблему.
Почему Python бросает ошибку памяти, когда я ожидаю, что он сможет выделить еще 2 ГБ данных?