Мне нужно ускорить выполнение скрипта Python, который читает большой CSV-файл кусками, выполняет некоторую обработку, а затем сохраняет обработанные строки в базе данных. Требуется сравнимое время (1,5 с) для обработки 10000 строк, а затем для их сохранения. Времена действительно имеют некоторые колебания, конечно, иногда обработка происходит быстрее, иногда сохраняется.
К сожалению, обработка записей не может быть легко распараллелена, потому что обработка является исторической (записи являются сделками с акциями, и есть расчеты, основанные на предыдущей операции). Возможно, но для этого вопроса можно сделать что-то, чтобы распараллелить обработку фрагмента с сохранением результатов предыдущего фрагмента. Это должно вдвое сократить общее время.
for chunk in pd.read_csv(filename, chunksize=chunksize):
# the following two tasks in parallel
persist (rows_from_previous_chunk) # this is I/O waiting, mostly
rows_to_save = process(chunk) # this is Python, not C
# wait for the above to finish
rows_from_previous_chunk = rows_to_save
Мой вопрос о том, какие рекомендуемые способы сделать выше. Я могу думать о нескольких:
Учитывая, что одной задачей является в основном ожидание ввода-вывода, есть вероятность, что я могу использовать многопоточность, не сталкиваясь с конфликтом GIL.
Второй вариант - использовать Dask, а именно Delayed . Однако, учитывая короткое время, используемое каждой задачей (до 2 секунд), я не уверен, что это лучший подход.
Третий вариант состоит в том, чтобы один процесс считывал и обрабатывал строки, а затем отправлял их через ограниченную очередь в отдельную, которая будет сохранять данные в БД. Использовать очередь JMS излишне, я думаю о multiprocessing.Queue()
Любой совет приветствуется. Я давний программист на Java, который недавно переключился на Python и научился жить с GIL, поэтому возникает вопрос.