Как использовать многопроцессорность / многопоточность для чтения CSV-файла и сохранения его в сгенерированных новых переменных? - PullRequest
0 голосов
/ 27 сентября 2019
  • У меня есть список имен файлов, и я использую его для генерации строки, которая будет новой переменной для хранения фрейма данных.
  • Приведенный ниже код не работает.
def filename(name):
    filename = f'{name}.csv'
    return pd.read_csv(filename(name))

with concurrent.futures.ProcessPoolExecutor() as executor:
    files = [
                '20190702',
                '20190703',
                '20190708',
    ]

    # list of stings which will be new variable names
    name_list = ['df_' + i.split('2019')[1] for i in files]

    # list to store new variables
    executor_list = []

    for i in range(len(files)):
        name = name_list[i]
        dataframe = executor.submit(filename, files[i])
        exec(f"{name} = {dataframe}") # Some error here!
        exec(f"executor_list.append({name})")

    for i in executor_list:
        exec(f"{i} = {i.result()}")

Я запустил это в colab, и я получил эту ошибку:

  File "<string>", line 1
    df_0702 = <Future at 0x7f0e5b8cc3c8 state=running>
              ^
SyntaxError: invalid syntax

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Вам не нужно использовать ProcessPoolExecutor, потому что ваша операция связана с вводом / выводом.Нерестовые нити дешевле, чем процессы.Таким образом, вы могли бы использовать ThreadPoolExecutor вместо этого.

def filename(name):
    filename = f'{name}.csv'
    return filename, pd.read_csv(filename(name))

files = ['20190702', '20190703', '20190708']

futures = []

with concurrent.futures.ThreadPoolExecutor() as executor:
    for i, filename in enumerate(files):
        vname = 'df_' + filename.split('2019')[1]
        filename = filename + '.csv'
        futures.append(executor.submit(pd.read_csv, filename))

results = [f.result() for f in futures]
0 голосов
/ 27 сентября 2019

executor.submit возвращает Future объект.Таким образом, вы должны получить результат из будущего объекта

files = ['20190702', '20190703', '20190708']

futures = {}

with concurrent.futures.ProcessPoolExecutor() as executor:
    for filename in files:
        vname = 'df_' + filename.split('2019')[1]
        filename = filename + '.csv'
        future = executor.submit(pd.read_csv, filename)
        futures[vname] = future

for vname, f in futures.items():
    dataframe = f.result()
    # do something with vname and dataframe

Plus, никогда не используйте функцию exec или eval, кроме как для целей отладки / тестирования.Они делают ваш код небезопасным и трудным для отладки.

...