gpt4 book ai didi

python - 即使有 block ,Dask 也会耗尽内存

转载 作者:行者123 更新时间:2023-12-02 03:01:31 25 4
gpt4 key购买 nike

我正在处理大型 CSV 文件,我需要制作笛卡尔积(合并操作)。由于内存错误,我尝试用 Pandas 解决问题(您可以查看 Panda 的代码和数据格式示例对于相同的问题here)但没有成功。现在,我正在尝试使用 Dask,它应该可以管理巨大的数据集,即使它的大小大于可用的 RAM。

首先我阅读了两个 CSV:

from dask import dataframe as dd

BLOCKSIZE = 64000000 # = 64 Mb chunks


df1_file_path = './mRNA_TCGA_breast.csv'
df2_file_path = './miRNA_TCGA_breast.csv'

# Gets Dataframes
df1 = dd.read_csv(
df1_file_path,
delimiter='\t',
blocksize=BLOCKSIZE
)
first_column = df1.columns.values[0]
df1.set_index(first_column)
df2 = dd.read_csv(
df2_file_path,
delimiter='\t',
blocksize=BLOCKSIZE
)
first_column = df2.columns.values[0]
df2.set_index(first_column)

# Filter common columns
common_columns = df1.columns.intersection(df2.columns)
df1 = df1[common_columns]
df2 = df2[common_columns]

然后,我将操作存储在磁盘上以防止内存错误:

# Computes a Cartesian product
df1['_tmpkey'] = 1
df2['_tmpkey'] = 1

# Neither of these two options work
# df1.merge(df2, on='_tmpkey').drop('_tmpkey', axis=1).to_hdf('/tmp/merge.*.hdf', key='/merge_data')
# df1.merge(df2, on='_tmpkey').drop('_tmpkey', axis=1).to_parquet('/tmp/')

我做了 a repo to try with exactly the same CSV files that I'm using .我试过使用较小的 blocksize 值,但我得到了同样的错误。我错过了什么吗?非常感谢任何形式的帮助。

最佳答案

我使用以下方法成功运行了您的代码,内存限制为 32GB。

我去掉了参数 BLOCKSIZE 并在 df1 和 df2 上使用了 repartition

df1 = df1.repartition(npartitions=50)
df2 = df2.repartition(npartitions=1)

请注意,与 df1 相比,df2 的大小确实更小(2.5 MB 对 23.75 MB),这就是为什么我只为 df2 保留一个分区并进行剪切的原因df1 分为 50 个分区。

这样做应该能让代码为您所用。对我来说,使用的内存保持在 12GB 以下。

为了检查,我计算了结果的长度:

len(df) # 3001995

按照上面的内容创建一个包含 50 个分区的 parquet 文件。您可以再次使用 repartition 来获得您想要的 partition_size。

注意:

添加这个应该会加速你的代码:

from dask.distributed import Client
client = Client()

在我的例子中,由于我的运行环境,我不得不使用参数 Client(processes=False)

关于python - 即使有 block ,Dask 也会耗尽内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59865572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com