Dask数据帧在连接parquet文件时抛出内存。

问题描述 投票:0回答:1

我有1024个parquet文件,每个文件大小为1mbin。我使用的是python dask 将1024个文件合并成一个文件,我有很大的磁盘空间,但内存是一些什么限制。

有什么有效的方法可以用python解决这个问题吗?dask?

import dask.dataframe as dd
def generatePath():
    for i in range(0,1024):
         return "data/2000-" + i +".parquet"

def readDF():
    paths = generatePath()
    for x in paths:
       df = dd.read_parquet(x, columns=['name', 'address'], engine='pyarrow')
       yield df

def mergeDF():
    allDF = readDF()
    df = next(allDF)
    for iter_DF in allDF:
        df = dd.concat([df,iter_DF])
    return df.compute()

这是我的代码,它抛出了内存错误。如果我在下面说错了,请纠正我。这段代码是一个文件一个文件的加载,并创建每个DF,然后连接。在这种情况下,它不需要很多内存吗?

有没有其他方法解决?

python apache-spark dask pyarrow dask-dataframe
1个回答
1
投票

更新答案

读取并将多个文件合并为一个 .parquet试试 .repartition(1) - 看到 这个 所以职位

# Read all files in `data/`
df = dd.read_parquet("data/", columns=['name', 'address'], engine='pyarrow')

# Export to single `.parquet` file
df.repartition(npartitions=1).to_parquet("data/combined", write_metadata_file=False)

这将合并所有文件在 data/ 归档

$ ls data/combined
part.0.parquet

注:使用多个拼花文件的好处--------。1, 2, 3, 4.

旧答案

不需要计算只是为了读取数据。它将很快填满你的RAM。这很可能是导致你的内存错误的原因。您可以使用 dd.read_parquet 并指定 data/ 文件夹直接

df = dd.read_parquet("data/", columns=['name', 'address'], engine='pyarrow')
© www.soinside.com 2019 - 2024. All rights reserved.