首页 > 解决方案 > 连接镶木地板文件的 Dask 数据帧会导致内存不足

问题描述

我有 1024 个镶木地板文件,每个 1mbin 大小。我正在使用 pythondask将这些 1024 个文件合并到一个文件中,并且我有很多磁盘空间,但是 ram 是有限的。

有没有使用 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,然后进行连接。在这种情况下,它不需要很多内存吗?

有没有其他方法可以解决?

标签: pythonapache-sparkdaskpyarrowdask-dataframe

解决方案


更新的答案

要读取多个文件并将其组合成一个文件.parquet,请尝试.repartition(1)- 请参阅SO 帖子

# 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

注意:使用多个 parquet 文件有好处 - 1234

旧答案

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

df = dd.read_parquet("data/", columns=['name', 'address'], engine='pyarrow')

推荐阅读