Есть бинарный файл (несколько ГБ), размер которого превышает объем оперативной памяти. Как можно его обработать при помощи mmap и multiprocessing?
Asked
Active
Viewed 137 times
1
-
Не читать целиком в память, а читать только те куски, которые нужны - не вариант? – Владимир Мартьянов Mar 16 '17 at 14:08
-
Вопрос в том, что заранее неизвестно какие куски нужны – kmz_61 Mar 16 '17 at 14:09
-
Ничто не мешает узнавать это в процессе работы и читать. Даже если файл нужно будет в итоге прочитать целиком, это можно сделать по кускам. – Владимир Мартьянов Mar 16 '17 at 14:10
-
Специфика задачи подразумевает, что необходимо анализировать весь файл целиком без разрыва(необходимо искать куски, удовлетворяющие регулярке) – kmz_61 Mar 16 '17 at 14:12
-
А какая максимальная длина фрагмента, удовлетворяющего регулярке? – Владимир Мартьянов Mar 16 '17 at 14:17
-
Фрагмент не более 30 символов – kmz_61 Mar 16 '17 at 14:19
-
В таком случае читать больше 30 байт за раз и не нужно... – Владимир Мартьянов Mar 16 '17 at 14:21
-
Но тогда придется использовать механизм плавающего окна, что снизит скорость – kmz_61 Mar 16 '17 at 14:27
-
Создаете несколько потоков. В каждом потоке читаете часть файла (например 1 поток с 0 линии по 10000, 2 c 10000 по 20000, и т.д.), результат роботы помещете в очередь. Очередь читаете в главном потоке. Проблемы? – Andrio Skur Mar 16 '17 at 14:59
-
Вы можете regex к mmap применить (если система 64-битная, то сразу весь файл как mmap можно открыть). Поиск паттерна (последовательность байт) в файле (несколько Гб) в Питоне 2 – jfs Mar 16 '17 at 21:08
-
Пример re + mmap: How to read tokens without reading whole line or file – jfs Mar 16 '17 at 21:30