我有一个大约200万行的熊猫数据框(每个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数据帧写入不同的文件?
编辑:我将线程解决方案保留在下面,以供您参考。但是,此解决方案应解决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()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句