我有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,然后连接。在这种情况下,它不需要很多内存吗?
有没有其他方法解决?
更新答案
读取并将多个文件合并为一个 .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')