Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.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
调用_csv时Dask数据帧存储器错误_Dask_Dask Dataframe - Fatal编程技术网

调用_csv时Dask数据帧存储器错误

调用_csv时Dask数据帧存储器错误,dask,dask-dataframe,Dask,Dask Dataframe,我目前正在以以下方式使用Dask S3上有以下格式的文件列表: /filetype1.gz /filetype2.gz /filetype1.gz /filetype2.gz …等等 我的代码读取filetype1的所有文件,并建立一个数据帧并设置索引(例如:df1=ddf.read\u csv(day1/filetype1.gz,blocksize=None,compression='gzip')。设置索引(index\u col)) 读取filetype2的所有文件,并构建一个大数据帧

我目前正在以以下方式使用Dask

  • S3上有以下格式的文件列表:
/filetype1.gz

/filetype2.gz

/filetype1.gz

/filetype2.gz

…等等

  • 我的代码读取
    filetype1
    的所有文件,并建立一个数据帧并设置索引(例如:
    df1=ddf.read\u csv(day1/filetype1.gz,blocksize=None,compression='gzip')。设置索引(index\u col)

  • 读取
    filetype2
    的所有文件,并构建一个大数据帧(与上面类似)

  • 通过
    merged_df=ddf.merge(df1,df2,how='internal',left_index=True,right_index=True)
    将两个数据帧合并在一起

  • 通过以下方式将结果写入S3:
    merged\u df.to\u csv()

注意:这里的目标实际上是在特定的一天内进行合并(即,在给定的一天内合并filetype1和filetype2),每天重复,并存储所有这些联接的并集,但似乎一次一天进行联接不会利用并行性,而且让Dask管理更大的联接会更有效。我认为Dask将根据docs()中的以下行以内存感知的方式管理较大的连接:

如果找不到足够的内存,Dask将不得不向磁盘读写数据,这可能会导致其他性能成本

我看到在调用
到_csv
时发生了
内存错误。我猜这是因为
to_csv
调用
compute
,它尝试计算联接的完整结果,然后尝试存储该结果。完整的文件内容当然不能放在内存中,但我认为(希望)Dask将运行计算并以内存感知的方式存储生成的数据帧。关于我应该如何使用Dask来完成我想做的事情,有什么指导或建议吗?提前谢谢

我看到在调用_csv时发生了内存错误。我猜这是因为to_csv调用compute,它尝试计算连接的完整结果,然后尝试存储该结果。完整的文件内容当然不能放在内存中,但我认为(希望)Dask将运行计算并以内存感知的方式存储生成的数据帧

总的来说,Dask确实会按照您期望的方式将事情组织起来并进行操作。以低内存的方式进行分布式连接很困难,但通常是可行的。如果没有更多的信息,我不知道如何在这里提供更多帮助,我理解在堆栈溢出时很难简洁地提供这些信息。我通常的建议是仔细观察仪表盘

注意:这里的目标实际上是在特定的一天内进行合并(即,在给定的一天内合并filetype1和filetype2),每天重复,并存储所有这些联接的并集,但似乎一次只进行一天的联接不会利用并行性,而且让Dask管理更大的联接会更有效

总的来说,你的直觉是正确的,一次给达斯克更多的工作是好的。然而,在这种情况下,看起来您知道一些Dask不知道的数据。您知道每个文件只与另一个文件交互。一般来说,连接必须以一个数据集的所有行都可以与另一个数据集的所有行交互的方式进行,因此Dask的算法必须非常通用,这可能会很昂贵

在你的情况下,我会使用熊猫和Dask delayed一次完成你所有的计算

lazy_results = []
for fn in filenames:
    left = dask.delayed(pd.read_csv, fn + "type-1.csv.gz")
    right = dask.delayed(pd.read_csv, fn + "type-1.csv.gz")
    merged = left.merge(right)
    out = merged.to_csv(...)
    lazy_results.append(out)

dask.compute(*lazy_results)
我看到在调用_csv时发生了内存错误。我猜这是因为to_csv调用compute,它尝试计算连接的完整结果,然后尝试存储该结果。完整的文件内容当然不能放在内存中,但我认为(希望)Dask将运行计算并以内存感知的方式存储生成的数据帧

总的来说,Dask确实会按照您期望的方式将事情组织起来并进行操作。以低内存的方式进行分布式连接很困难,但通常是可行的。如果没有更多的信息,我不知道如何在这里提供更多帮助,我理解在堆栈溢出时很难简洁地提供这些信息。我通常的建议是仔细观察仪表盘

注意:这里的目标实际上是在特定的一天内进行合并(即,在给定的一天内合并filetype1和filetype2),每天重复,并存储所有这些联接的并集,但似乎一次只进行一天的联接不会利用并行性,而且让Dask管理更大的联接会更有效

总的来说,你的直觉是正确的,一次给达斯克更多的工作是好的。然而,在这种情况下,看起来您知道一些Dask不知道的数据。您知道每个文件只与另一个文件交互。一般来说,连接必须以一个数据集的所有行都可以与另一个数据集的所有行交互的方式进行,因此Dask的算法必须非常通用,这可能会很昂贵

在你的情况下,我会使用熊猫和Dask delayed一次完成你所有的计算

lazy_results = []
for fn in filenames:
    left = dask.delayed(pd.read_csv, fn + "type-1.csv.gz")
    right = dask.delayed(pd.read_csv, fn + "type-1.csv.gz")
    merged = left.merge(right)
    out = merged.to_csv(...)
    lazy_results.append(out)

dask.compute(*lazy_results)

调用
到\u csv
是否也必须延迟?这难道不会立即计算吗?延迟对象的方法在默认情况下是懒惰的对
到\u csv
的调用也必须延迟吗?那不是马上就可以计算吗?延迟对象的方法在默认情况下是惰性的