2013-09-04 6 views
0

один файл размером более 2G. Я звоню open(f, "rb").read() MemoryError. Я звоню open(f, "rb").read(1<<30) OKMemoryError при чтении файла размером более 2G

Как я могу устранить предел 2G? У меня достаточно памяти - 16G

+8

Для программ, работающих в 32 бит, процесс имеет ограниченную (доступную) рабочую память объемом 2 ГБ. Вы не можете преодолеть это ограничение, если не работаете на 64-битной основе. – Itaypk

+0

Зачем вам нужно читать весь 2GB-файл за один раз? Не можете ли вы обработать его в кусках размером с укусом? Например, использование файла в качестве итератора дает вам данные по строкам. –

+0

@MartijnPieters просто для проверки эффективности чтения диска. но получить MemoryError для файла> 2G, поэтому я изменил его на 1G (1 << 31). – wuhaochi

ответ

0

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

+1

Зачем вы это принимаете? –

4

Как насчет использования файлов с памятью (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() 
+0

спасибо! научился. – wuhaochi

2

Как отмечает @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 

Вышеупомянутый цикл не исчерпывает всю доступную память в вашей системе.

+0

2 GiB - '2^31'. –

+0

Да, и если бы я использовал GiB, я бы исправил его. –

Смежные вопросы