Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dask.dataframe.to_拼花地板制作超大文件_Dask_Parquet - Fatal编程技术网

Dask.dataframe.to_拼花地板制作超大文件

Dask.dataframe.to_拼花地板制作超大文件,dask,parquet,Dask,Parquet,我正在将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

我正在将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读取文件,并将其转换为拼花地板。 我安装了快速拼花地板

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”的文件 96MB 创建了一个名为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'))

您提供的代码生成100MB的CSV和93MB的拼花地板数据集。区别在于您可能缺少snappy,即压缩库

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

一些注释

  • 500列是高的,这意味着你没有真正的“表格”数据的意义上,拼花地板是为;所有这些列的schema和details块占用空间,并且在文件之间重复
  • 由于列数较多,每个分区的行数比通常情况下要小得多,因此meatadata的空间开销也相应较高
  • 可以放弃为每个列块生成min/max stats,而不生成元数据文件,而是依赖于每个文件中相同的模式;但这并不是一件容易向用户公开的事情。(前者仅存在于PR中)
  • 文本按每个字符串的(长度)(数据)块存储,其中长度为4字节;因此,如果每个文本字符串为2个字节,它们将在拼花数据中存储为6个字节,在CSV中存储为3个字节(因为逗号)。一种变体编码将长度分开,这样它们就可以有效地存储为整数(因为它们都是相同的值,所以工作得非常好),但是没有一个拼花框架真正实现了这一点

您是否考虑过一次读取一个文件并将其转换为拼花地板?获得一个比一个
txt
大的
拼花地板真的很奇怪。你用的是哪个引擎?我把它作为默认引擎。考虑到我只安装了fastparquet,我假设它将使用fastparquet,你能提供一个吗?即使使用numpy生成的数据。添加到我的编辑器中,安装snappy也给了我一个93MB的文件。非常感谢。你有没有一个更好的方法来存储一个500列的文件,我可以在Dask中使用它?如果这真的是一个数字数组,我会使用zarr和Dask.array。如果不理解这些数据的用途,很难说。它有2亿行,其中400/500列是字母或空格。“字母或空格”-听起来很像数字或分类。如果您使用int8或cats,您会发现拼花地板在速度和尺寸方面有更好的性能;但是,可以使用类似数组的格式(如zarr)来存储。