Есть ли ограничение памяти для метода np.fromfile ()? - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь прочитать большой файл в массив с помощью np.fromfile(), однако после определенного количества байтов он выдает MemoryError.

with open(filename,'r') as file:
    data = np.fromfile(file, dtype=np.uint16, count=2048*2048*63)
    data = data.reshape(63, 2048, 2048)

Работает нормально с 2048 *2048* 63однако не работает с 2048 *2048* 64.Как это отладить?Мне интересно, что здесь является узким местом?

Редактировать: я работаю на Windows 10, RAM 256 ГБ, это автономный скрипт, 64-битный Python.

Edit2: я следовал советам в комментариях, теперь получаю ошибку на 128 *2048* 2048, отлично работает с 127 *2048* 2048.

1 Ответ

0 голосов
/ 06 февраля 2019

Несмотря на то, что вы верите, вы установили 32-битную версию Python в 64-битной операционной системе, что означает, что виртуальное адресное пространство ограничено только 2 ГБ в пользовательском режиме, и пытается выделить смежные блоки в ГБ.или больше могут легко потерпеть неудачу из-за фрагментации адресного пространства.

Дешевой раздачей является ваша sys.maxsize, которая является просто наибольшим значением, представляемым C ssize_t в вашей сборке Python.2147483647 соответствует 2**31 - 1, что является ожидаемым значением для 32-битного Python.64-битная сборка выдаст 9223372036854775807 (2**63 - 1).

Удалите 32-битную версию Python и загрузите / установите 64-битную версию (ссылка на страницу загрузки 3.7.2) (ищите установщик, который будет помечен как x86-64, , а не x86; имя файла будет включать amd64).Досадно, что главная страница для загрузки Python по умолчанию предлагает 32-битную версию для Windows, поэтому вам нужно прокрутить вниз ссылки на конкретные страницы загрузки версий, нажать на последнюю версию, а затем прокрутить вниз до полнойсписок по ОС и битности и выбрать соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...