Python - отдельный поток для параллельной записи данных замедляет мой код - но почему? - PullRequest
0 голосов
/ 06 февраля 2019

Мой поток кода выглядит примерно так:

import pandas as pd
import threading
import helpers

for file in files:
    df_full = pd.read_csv(file, chunksize=500000)
    for df in df_full:
        df_ready = prepare_df(df)
        # testing if the previous instance is running
        if isinstance(upload_thread, threading.Thread):
            if upload_thread.isAlive():
                print('waiting for the last upload op to finish')
                upload_thread.join()

        # starts the upload in another thread, so the loop can continue on the next chunk
        upload_thread = threading.Thread(target=helpers.uploading, kwargs=kwargs)
        upload_thread.start()

Это работает, проблема в том, что запуск его с многопоточностью замедляет его!

Моя идея потока кода:

  1. обработать порцию данных

  2. после того, как она будет завершена, загрузить ее на фон

  3. во время загрузки,перейти к следующему шагу, то есть к обработке следующего куска данных

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

Я уверен, что что-то напутал, пожалуйста, помогите мне узнать, что это такое.

Также эта функция 'helpers.uploading' возвращает мне важные результаты.Как я могу получить доступ к этим результатам?В идеале мне нужно добавить результат каждой итерации в список результатов.Без потоков это было бы что-то вроде:

import pandas as pd
import helpers

results = []

for file in files:
    df_full = pd.read_csv(file, chunksize=500000)
    for df in df_full:
        df_ready = prepare_df(df)
        result = helpers.uploading(**kwargs)
        results.append(result)

Спасибо!

...