один файл размером более 2G. Я звоню open(f, "rb").read()
MemoryError. Я звоню open(f, "rb").read(1<<30)
OKMemoryError при чтении файла размером более 2G
Как я могу устранить предел 2G? У меня достаточно памяти - 16G
один файл размером более 2G. Я звоню open(f, "rb").read()
MemoryError. Я звоню open(f, "rb").read(1<<30)
OKMemoryError при чтении файла размером более 2G
Как я могу устранить предел 2G? У меня достаточно памяти - 16G
Даже если ваш файл может быть всего 2 ГБ, накладные расходы на его чтение могут привести к использованию более 2 ГБ используемой памяти.
Зачем вы это принимаете? –
Как насчет использования файлов с памятью (mmap
)? Это хороший пример в documentation on python.org. Он адаптирован ниже.
with open(f, "rb") as fi:
# memory-map the file, size 0 means whole file
mm = mmap.mmap(fi.fileno(), 0)
# Do stuff
mm.close()
спасибо! научился. – wuhaochi
Как отмечает @itaypk, 32-разрядные исполняемые файлы ограничены 2 ГБ доступного бара (2^31). Чтобы использовать дополнительную оперативную память, вам нужно запустить 64-битную версию Python.
В зависимости от того, что вам нужно сделать с файлом, вам, возможно, не нужно читать его полностью. Вы можете пройти через него:
with open('huge_file.txt') as f:
for line in f:
print line # print one line at a time
Вышеупомянутый цикл не исчерпывает всю доступную память в вашей системе.
2 GiB - '2^31'. –
Да, и если бы я использовал GiB, я бы исправил его. –
Для программ, работающих в 32 бит, процесс имеет ограниченную (доступную) рабочую память объемом 2 ГБ. Вы не можете преодолеть это ограничение, если не работаете на 64-битной основе. – Itaypk
Зачем вам нужно читать весь 2GB-файл за один раз? Не можете ли вы обработать его в кусках размером с укусом? Например, использование файла в качестве итератора дает вам данные по строкам. –
@MartijnPieters просто для проверки эффективности чтения диска. но получить MemoryError для файла> 2G, поэтому я изменил его на 1G (1 << 31). – wuhaochi