Dask数据帧连接拼花文件时内存不足

时间:2020-05-12 18:27:15

标签: python apache-spark dask pyarrow dask-dataframe

我有1024个实木复合地板文件,每个1mbin大小。我正在使用python dask将这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,然后进行串联。在这种情况下,它不需要很多内存吗?

还有其他解决方法吗?

1 个答案:

答案 0 :(得分:2)

更新后的答案

要读取多个文件并将其合并到一个.parquet中,请尝试.repartition(1)-参见this这样的帖子

# 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

注意:使用多个实木复合地板文件-1234有很多好处。

旧答案

无需为了读取数据而进行计算。它将迅速填满您的RAM。这可能导致您的内存错误。您可以使用dd.read_parquet并直接指定data/文件夹

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