我有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,然后进行串联。在这种情况下,它不需要很多内存吗?
还有其他解决方法吗?
答案 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
旧答案
无需为了读取数据而进行计算。它将迅速填满您的RAM。这可能导致您的内存错误。您可以使用dd.read_parquet
并直接指定data/
文件夹
df = dd.read_parquet("data/", columns=['name', 'address'], engine='pyarrow')