Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Dask内存不足,即使有块_Python_Python 3.x_Dask - Fatal编程技术网

Python Dask内存不足,即使有块

Python Dask内存不足,即使有块,python,python-3.x,dask,Python,Python 3.x,Dask,我正在处理大的CSV文件,我需要做一个笛卡尔积(合并操作)。我曾试图解决Panda的问题(您可以检查Panda的代码和相同问题的数据格式示例),但由于内存错误,没有成功。现在,我正在尝试Dask,它应该能够管理巨大的数据集,即使它的大小大于可用的RAM 首先,我阅读了CSV: from dask import dataframe as dd BLOCKSIZE = 64000000 # = 64 Mb chunks df1_file_path = './mRNA_TCGA_breast.

我正在处理大的CSV文件,我需要做一个笛卡尔积(合并操作)。我曾试图解决Panda的问题(您可以检查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/')

我已经做好了准备。我尝试过使用较小的
块大小
值,但得到了相同的错误。我错过什么了吗?非常感谢您的任何帮助。

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

我已经去掉了参数
BLOCKSIZE
,在df1和df2上使用了
重新分区

df1 = df1.repartition(npartitions=50)
df2 = df2.repartition(npartitions=1)
请注意,与df1相比,df2的大小实际上更小(2.5 MB vs 23.75 MB),这就是为什么我只为df2保留了一个分区,并将df1分成50个分区的原因

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

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

len(df) # 3001995
按照上面的内容创建一个有50个分区的拼花地板文件。 您可以再次使用
重新分区
,以获得所需的分区大小

NB:

添加此选项可以加快代码的速度:

from dask.distributed import Client
client = Client()

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

您也可以共享普通的Pandas代码吗?你有输出应该是什么样子的例子吗?谢谢你的关注!当然可以!我编辑了这个问题,添加了另一个堆栈溢出问题的链接,在这里您可以欣赏代码和数据格式示例非常感谢!!我试试看,告诉你不客气。也许你可以用不到50英镑试试。我一开始试过100,当然!由于它可以并行运行多次,我可能会选择一个占用更少内存的重新分区大小,以避免出现错误。又比你强!你好它起作用了!不幸的是,它非常慢,因为我必须设置更多的分区(我只有8GB的RAM)。我会按照中的建议尝试Cython和Numba,看看会发生什么我不知道这对你是否有可能,但你可以使用超过8GB的内存