【发布时间】:2019-04-24 14:30:49
【问题描述】:
我正在将 10 个固定宽度的大型文件(平均 19GB)转换为镶木地板。 我通过堆叠固定宽度的文件来做到这一点
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 MB 的文件,总计 340GB,并且还在增长。 有没有一种方法可以在不堆叠文件的情况下将文件读入 dask 数据帧,这样会更快吗? 有什么可以改变的以使输出文件更小吗?我的理解是镶木地板是压缩的,应该小于 .txt 文件。
编辑 添加了重现问题的代码: 这段代码在我的机器上运行了 4 分钟。它创建了一个文件“test.csv” 96 MB 并创建了一个文件“test.parquet” 239 MB。 我正在为我目前遇到问题的代码使用固定宽度文件,但 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'))
【问题讨论】:
-
您是否考虑过一次阅读并转换成 parquet 文件?获得比
txt更大的parquet真的很奇怪。您使用的是哪个引擎? -
我将其保留为默认值。考虑到我只安装了 fastparquet,我假设它将使用 fastparquet
-
你能提供一个mcve吗?即使使用 numpy 生成的数据。
-
添加到我的编辑中