Что лучший способ состоит в том, чтобы разделить большие файлы на Python для многопроцессорной обработки?

Я имею два, что я использую много, первое является стандартным, вторым, необходимо отобразиться:

Ctrl + , Ctrl + E , F (Выбор Все, Выбор Формата)

Ctrl + E , R (Удаляют Неиспользованные Использования и Вид)

И справка платят наличными за "долг хлама" рано и часто

17
задан Community 23 May 2017 в 12:26
поделиться

7 ответов

Одна из лучших архитектур уже является частью ОС Linux. Никаких специальных библиотек не требуется.

Вам нужен «разветвленный» дизайн.

  1. «Основная» программа создает ряд подпроцессов, соединенных конвейерами.

  2. Основная программа читает файл, записывая строки в конвейеры. выполнение минимальной фильтрации, необходимой для передачи строк в соответствующие подпроцессы.

9
ответ дан 30 November 2019 в 13:34
поделиться

Одна стратегия состоит в том, чтобы назначить каждому рабочему смещение, поэтому, если у вас есть восемь рабочих процессов, вы назначаете номера от 0 до 7. Рабочий номер 0 читает первые процессы записи, затем пропускает 7 и переходит к обработке 8-й записи и т. Д., рабочий номер 1 читает вторую запись, затем пропускает 7 и обрабатывает 9-ю запись .........

У этой схемы есть ряд преимуществ. Неважно, насколько велик файл, работа всегда делится поровну, процессы на одном компьютере будут обрабатываться примерно с одинаковой скоростью и использовать одни и те же буферные области, поэтому вы не несете чрезмерных накладных расходов на ввод-вывод.

6
ответ дан 30 November 2019 в 13:34
поделиться

Вы не упоминаете, как вы обрабатываете строки; возможно, самая важная информация.

Каждая строка независима? Зависит ли расчет от того, что одна строка предшествует следующей? Должны ли они обрабатываться блоками? Сколько времени занимает обработка каждой строки? Есть ли этап обработки, который должен включать «все» данные в конце? Или можно выбросить промежуточные результаты и сохранить только текущий результат? Можно ли изначально разделить файл, разделив размер файла на количество потоков? Или он увеличивается по мере того, как вы его обрабатываете?

Если строки независимы, а файл не растет, единственное, что вам нужно, - это передать «начальные адреса» и «длины» каждому из рабочих; они могут независимо открывать и искать файл, и тогда вы должны просто координировать их результаты; возможно, ожидая, пока N результатов вернутся в очередь.

Если строки не являются независимыми, ответ будет сильно зависеть от структуры файла.

4
ответ дан 30 November 2019 в 13:34
поделиться

Я знаю, что вы конкретно спрашивали о Python, но я рекомендую вам взглянуть на Hadoop ( http://hadoop.apache.org/ ): он реализует карту и алгоритм Reduce, специально разработанный для решения этой проблемы.

Удачи

1
ответ дан 30 November 2019 в 13:34
поделиться

Это во многом зависит от формата вашего файла.

Есть ли смысл где-нибудь разделить? Или вам нужно разделить его на новую строку? Или вам нужно убедиться, что вы разбили его в конце определения объекта?

Вместо разделения файла вы должны использовать несколько считывателей в одном файле, используя os.lseek для перехода в соответствующую часть файла.

Обновление: Плакат добавил, что хочет разбить на новые строки. Тогда я предлагаю следующее:

Допустим, у вас 4 процесса. Тогда простое решение - os.lseek до 0%, 25%, 50% и 75% файла и читать байты, пока вы не дойдете до первой новой строки. Это ваша отправная точка для каждого процесса. Для этого не нужно разделять файл, просто найдите нужное место в большом файле в каждом процессе и начните чтение оттуда.

1
ответ дан 30 November 2019 в 13:34
поделиться

Некоторые заметки по тесту Wide Finder Тима Брея Фредрика Лунда - это интересное чтение об очень похожем сценарии использования с большим количеством полезных советов. Различные другие авторы также реализовали то же самое, некоторые из них связаны из статьи, но вы можете попробовать поискать в Google "поиск на уровне Python" или что-то еще, чтобы найти что-то еще. (где-то также было решение, основанное на модуле multiprocessing , но оно, похоже, больше недоступно)

1
ответ дан 30 November 2019 в 13:34
поделиться

Если время выполнения велико, вместо того, чтобы каждый процесс читал свою следующую строку через Очередь , пусть процессы читают пакеты строк. Таким образом, накладные расходы амортизируются по нескольким линиям (например, тысячи и более).

0
ответ дан 30 November 2019 в 13:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: