Эффективно записывать большие pandas данные в разные файлы - PullRequest
1 голос
/ 03 февраля 2020

У меня есть pandas фрейм данных около 2 миллионов строк (по 80 столбцов в каждой).

Я бы хотел вывести данные в csv, а также в файл партера.

Предположим, что фрейм данных присутствует в переменной df

Исходный подход :

print('Creating csv and parquet files')
st = time.time()
df.to_csv('output_file.csv')
df.to_parquet('output_file.parquet')
print(f'Created csv and parquet files in {time.time() - st} seconds')

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

Более новый подход :

def build_csv(dataframe, output_filename):
    print(f'Building csv: {output_filename}')
    dataframe.to_csv(output_filename)


def build_parquet(dataframe, output_filename):
    print(f'Building parquet: {output_filename}')
    dataframe.to_parquet(output_filename)


with ProcessPoolExecutor(max_workers=3) as executor:
    executor.submit(build_csv, (df, 'output_file.csv'))
    executor.submit(build_parquet, (df, 'output_file.parquet'))

Более новый подход работает успешно, но я делаю не вижу никаких создаваемых файлов. Я не уверен, почему это происходит.

Есть ли лучший (более быстрый) подход для записи pandas кадра данных в разные файлы?

Ответы [ 2 ]

2 голосов
/ 03 февраля 2020

РЕДАКТИРОВАТЬ: я сохранил решение потоков ниже для вашей справки. Однако это решение должно решить проблему Python GIL. Я проверил это и вижу, что файлы были успешно записаны:

from multiprocessing import Pool
import pandas as pd

# original data:
data = pd.DataFrame([
    [ 1, 2, 3, 4,], 
    [ 1, 2, 3, 4,], 
    [ 1, 2, 3, 4,], 
    [ 1, 2, 3, 4,], 
    [ 1, 2, 3, 4,],
])    


def SaveDataToCsv(data):
    print('Started export to .csv')
    data.to_csv('data.csv')
    print('Finished export to .csv')


def SaveDataToParquet(data):
    print('Started export to .parquet')
    data.to_parquet('data.parquet')
    print('Finished export to .parquet')


# multiprocessing method:
pool = Pool(processes=2)
process1 = pool.apply_async(SaveDataToCsv, [data])
process2 = pool.apply_async(SaveDataToParquet, [data])

Протестировал библиотеку threading, и, похоже, она работает нормально:

import pandas as pd
import threading

# original data:
data = pd.DataFrame([
    [ 1, 2, 3, 4,],
    [ 1, 2, 3, 4,],
    [ 1, 2, 3, 4,],
    [ 1, 2, 3, 4,],
    [ 1, 2, 3, 4,],
])


def SaveDataToCsv(data):        
    data.to_csv('data.csv')


def SaveDataToParquet(data):
    data.to_parquet('data.parquet')    

thread1 = threading.Thread(target=SaveDataToCsv, args=(data,))
thread2 = threading.Thread(target=SaveDataToParquet, args=(data,))

thread1.start()
thread2.start()
0 голосов
/ 03 февраля 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...