当前位置: 首页 > 知识库问答 >
问题:

Dask内存不足,即使有块

周志文
2023-03-14

我正在处理大的CSV文件,我需要做一个笛卡尔积(合并操作)。我试着面对Pandas的问题(您可以在这里检查Panda的代码和数据格式示例以查找相同的问题),但由于内存错误而没有成功。现在,我尝试使用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/')

我做了一个回购,尝试与我正在使用的完全相同的CSV文件。我尝试使用较小的blocksize值,但我得到了同样的错误。我是不是漏掉了什么?任何帮助都是非常感激的。

共有1个答案

卜弘文
2023-03-14

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

我已经去掉了参数blocksize并在df1和DF2上使用了repartition

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

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

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

为了检查,我计算了结果的透镜:

len(df) # 3001995

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

注意:

添加这个功能可以加快代码的速度:

from dask.distributed import Client
client = Client()

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

 类似资料:
  • 我正在努力解决古老的字谜问题。多亏了许多教程,我能够迭代一组字符串,递归地找到所有的排列,然后将它们与英语单词列表进行比较。我发现的问题是,在大约三个单词之后(通常是关于“变形”之类的东西),我会得到一个OutOfMemory错误。我试着把我的批分成小的集合,因为它似乎是消耗我所有内存的递归部分。但即使只是“变形”也把它锁起来了... 编辑:根据出色的反馈,我已经将生成器从排列更改为工作查找: 它

  • 问题内容: 我今天遇到一个奇怪的问题。对于其他人来说,这可能是一个简单的答案,但这让我感到困惑。为什么下面的代码会导致内存错误? 我得到了这两个错误之一…第一个是在节点的解释器中运行此代码时,第二个是通过nodeunit运行它时: 严重错误:CALL_AND_RETRY_2分配失败-内存不足 严重错误:JS分配失败-内存不足 问题答案: 当我尝试访问阵列时会发生这种情况。但是获取长度却没有。

  • 问题内容: 今天,我运行了用于文件系统索引编制的脚本,以刷新RAID文件索引,并在4小时后崩溃并出现以下错误: 服务器配备16GB RAM和24GB SSD交换。我非常怀疑我的脚本是否超过了36gb的内存。至少不应该 脚本使用文件元数据(修改日期,权限等,无大数据)创建存储为对象数组的文件索引 过去,我曾经用此脚本经历过奇怪的节点问题,这使我不得不这样做。在处理诸如String之类的大文件时,由于

  • 我正在PyTorch中运行一个评估脚本。我有许多经过训练的模型(*.pt文件),我将其加载并移动到GPU,总共占用270MB的GPU内存。我使用的批量大小为1。对于每个示例,我加载一个图像并将其移动到GPU。然后,根据样本,我需要运行一系列经过训练的模型。有些模型以张量作为输入和输出。其他模型的输入是张量,输出是字符串。序列中的最终模型总是有一个字符串作为输出。中间张量临时存储在字典中。当模型使用

  • STS不断崩溃,项目文件夹中的日志如下: 它始于我使用Winmerge比较和修改STS之外的java、pom和属性文件时

  • 我是刚到爪哇的。我只是试图了解如何处理堆内存溢出及其原因。有人能在下面的代码中帮助我为什么它会抛出这个错误吗。我怎么能避免。 错误: 线程“main”Java.lang.OutOfMemoryError中出现异常:Java.util.arrays.copyof(arrays.Java:2361)在Java.lang.AbstractStringBuilder.ExpandCapacity(Abst