首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dask.dataframe.to_parquet制作超大型文件

Dask.dataframe.to_parquet制作超大型文件
EN

Stack Overflow用户
提问于 2019-04-24 14:30:49
回答 1查看 1.5K关注 0票数 1

我正在转换10个大的固定宽度文件(平均19 10 )为一个地板。我是通过堆叠固定宽度的文件来做到这一点的。

代码语言:javascript
复制
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读取文件,并将其转换为拼花。我已经安装了紧固件。

代码语言:javascript
复制
df = dd.read_fwf(stacked.txt, colspecs = colspecs, names = names)
df.to_parquet('parquet.parquet')

我计划对此添加一些处理,比如通过重置索引和对列进行计算来对其进行排序,但就目前而言,当我学习dask时,我想看看如何将它更改为一个拼花。它已经运行了2天,已经产生了2200 151 MB的文件,总计340 MB,而且还在增长。有没有一种方法,我可以在不堆叠的情况下将文件读入dask数据帧,这样会更快吗?还有什么我可以更改以使输出文件更小吗?我的理解是parquets是压缩的,并且应该比.txt文件小。

编辑添加了代码来重现这个问题:这段代码在我的机器上运行了4分钟。它创建的文件“test.csv”为96 MB,并创建了文件“test.parquet”为239 MB。我正在使用一个固定宽度的文件来处理我目前正在处理的代码,但是csv似乎再现了将文件大小增加两倍的效果。

代码语言:javascript
复制
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'))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-24 17:21:06

您提供的代码生成一个100 of的CSV和93MB的parquet数据集。不同之处在于,您可能缺少快速压缩库。

对于随机文本数据来说,这并不是不典型的,因为它通常不能很好地压缩。有一些技巧,您可以使用固定宽度列(快速拼花允许,但很少使用)和分类/字典编码(这将取决于数据的基数)。

一些笔记

  • 500列很高,这意味着您没有真正的“表格”数据,就像拼花那样;所有这些列的模式和详细信息块占用空间,并且在文件之间重复。
  • 由于列数较多,每个分区的行数比典型的要小得多,因此肉类数据的空间开销按比例更高。
  • 可以放弃生成每个列块的min/max统计数据,而不是生成元数据文件,而是依赖于每个文件中的模式是相同的;但这不是很容易向用户公开的东西。(前者只存在于公共关系中)
  • 文本由每个字符串的( length )( data )块存储,其中长度为4个字节;因此,如果文本字符串每个为2字节,那么它们将被存储为拼板数据中的6个字节和CSV中的3个字节(因为逗号)。一个变体编码将长度分隔开来,这样它们就可以高效地存储为整数(因为它们都是相同的值,所以工作得非常好),但是没有一个parquet框架真正实现了这一点。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55832548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档