Я преобразую 10 больших файлов фиксированной ширины (в среднем 19 ГБ) в паркет.Я делаю это, складывая файлы фиксированной ширины
file_list = [files]
stacked_files = open(stacked.txt,'a')
for i in file_list:
f = open(i)
for line in f:
stacked_files.write(line)
f.close()
print(i,(time.time() - file_start)//60)
stacked_files.close()
Этот процесс занял 3 часа.Затем я использую dask, чтобы прочитать файл и преобразовать его в паркет.У меня установлен fastparquet
df = dd.read_fwf(stacked.txt, colspecs = colspecs, names = names)
df.to_parquet('parquet.parquet')
Я планирую добавить к этому некоторую обработку, например, сортировку путем сброса индекса и выполнения вычислений по столбцам, но сейчас, когда я изучаю dask, я хочу посмотреть, как меняетсяэто паркету работает.Это работает в течение 2 дней, и сделал более 2200 151 МБ файлов общим объемом 340 ГБ, и это все еще растет.Есть ли способ, которым я могу читать файлы в dask-фрейме данных, не складывая их, и будет ли это быстрее?И что я могу изменить, чтобы уменьшить размер выходного файла?Насколько я понимаю, паркет сжимается и должен быть меньше, чем файл .txt.
edit Добавлен код для воспроизведения проблемы: Этот код занял 4 минуты для запуска на моей машине.Он создал файл 'test.csv' размером 96 МБ и файл 'test.parquet' размером 239 МБ.Я использую файл с фиксированной шириной для кода, с которым у меня сейчас проблемы, но csv, похоже, воспроизводит эффект утроения размера файла.
import dask.dataframe as dd
import pandas as pd
import random
import os
test_file_folder = 'folder'
#create 500 columns
colnames = []
letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
first_letter = 0
for i in range(500):
second_letter = i%26
colnames.append(letters[first_letter]+letters[second_letter])
if i%26 == 0 and i !=0:
first_letter +=1
#create a dictionary with 100,000 data points in each key with column names as keys
df = {}
for i in colnames:
temp = []
for x in range(100000):
temp.append(random.choice(letters))
df[i] = temp
#create the df and send it to csv
df = pd.DataFrame.from_dict(df)
df.to_csv(os.path.join(test_file_folder,'test.csv'))
ddf = dd.read_csv(os.path.join(test_file_folder,'test.csv'))
ddf.to_parquet(os.path.join(test_file_folder,'test.parquet'))