numpy.memmap не может обрабатывать очень большие данные - PullRequest
0 голосов
/ 15 января 2019

Мне нужно держать в памяти очень большой вектор размером около 10 ** 8, и мне нужен быстрый произвольный доступ к нему. Я пытался использовать numpy.memmap, но обнаружил следующую ошибку:

RuntimeWarning: overflow encountered in int_scalars bytes = long(offset + size*_dbytes)

fid.seek(bytes - 1, 0): [Errno 22] Invalid argument

Кажется, что memmap использует long, а длина моего вектора слишком велика.

Есть ли способ преодолеть это и использовать memmap? или может есть хорошая альтернатива?

Спасибо

1 Ответ

0 голосов
/ 15 января 2019

Простое решение

Похоже, вы используете 32-битную версию Python (я также предполагаю, что вы работаете в Windows). Из numpy.memmap документов:

Размер файлов, отображаемых в память, не может превышать 2 ГБ в 32-разрядных системах.

Итак, простое решение вашей проблемы - просто обновить установку Python до 64-битной.

Если ваш процессор был изготовлен где-то в это последнее десятилетие, то должна быть возможность обновления до 64-битного Python.

Альтернативы

Пока ваш Python 32-битный, работа с массивами размером более 2 ГБ никогда не будет легкой или прямой. Ваша единственная реальная возможность - разбить массив на части размером не более 2 ГБ в то время, когда вы изначально его создавали / записывали на диск. Затем вы будете работать с каждым произведением независимо.

Кроме того, вам все равно придется использовать numpy.memmap с каждым элементом, так как в противном случае самому Python не хватит памяти.

Мощные альтернативы

Если вам приходится регулярно обрабатывать большие массивы такого типа, вам следует подумать о переключении своего кода / рабочего процесса на одну из структур больших данных. Теперь для Python есть целая куча из них. Раньше я широко использовал Pyspark , и он довольно прост в использовании (хотя требует кучу настроек). В комментариях Б. М. упоминает Dask , еще один такой большой фреймворк данных.

Хотя, если это только одноразовая задача, вероятно, не стоит беспокоиться о том, чтобы раскрутить одну из этих платформ.

...