添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
本文介绍了如何在Dask、xarray和pandas中选择最佳的chunk大小以优化性能。强调了Dask在处理大数据时的优势,以及避免过度订阅线程的重要性。还提到了Xarray在管理复杂数据集时的便利性,并提供了构建自定义操作的建议。建议的块大小通常不小于100MB,并应与存储格式对齐,以减少读取开销。此外,设置环境变量如`OMP_NUM_THREADS`来限制多线程库的线程数可以提高性能。 摘要由CSDN通过智能技术生成

如何在xarray、pandas、dask中选择最佳的chunk

使用 Dask 数组很容易上手,但使用好它们确实需要一些经验。此页面包含最佳实践建议,并包含常见问题的解决方案。

使用 NumPy

如果您的数据在 RAM 中很合适,并且您不受性能限制,那么使用 NumPy 可能是正确的选择。Dask 增加了另一层复杂性,这可能会妨碍您。

如果您只是在寻找加速而不是可扩展性,那么您可能需要考虑像Numba这样的项目

选择一个好的块大小

Dask Array 用户的一个常见性能问题是他们选择的 块大小要么太小(导致大量开销),要么与他们的数据对齐不佳(导致读取效率低下)。

虽然最佳大小和形状是高度特定于问题的,但很少看到 小于 100 MB 的块大小。如果您正在处理 float64 数据,那么这大约是 2D 数组或 3D 数组的大小。(4000, 4000)(100, 400, 400)

您想选择一个大的块大小以减少 Dask 必须考虑的块数量(这会影响开销),但也要足够小,以便它们中的许多块可以同时放入内存中。Dask 在内存中的块数通常是活动线程数的两倍。

定位你的块

读取数据时,您应该将您的chunk与您的存储格式对齐。大多数数组存储格式本身将数据存储在块中。如果您的 Dask 数组块不是这些块形状的倍数,那么您将不得不重复读取相同的数据,这可能会很昂贵。请注意,尽管通常存储格式选择的块大小比 Dask 的理想大小要小得多,比 100MB 更接近 1MB。在这些情况下,您应该选择与存储块大小一致的 Dask 块大小,并且每个 Dask 块维度都是存储块维度的倍数。

因此,例如,如果我们有一个大小为 s 的HDF文件,我们可能会选择一个.(128, 64)(1280, 6400)

import h5py
storage = h5py.File(‘myfile.hdf5’)[‘x’]
storage.chunks
(128, 64)

import dask.array as da
x = da.from_array(storage, chunks=(1280, 6400))
请注意,如果您提供,则 Dask Array 将寻找一个 属性并使用它来提供一个好的分块。chunks=‘auto’.chunks

避免超额订阅线程

默认情况下,Dask 将运行与逻辑核心一样多的并发任务。它假设每个任务将消耗大约一个核心。但是,许多数组计算库本身是多线程的,这可能会导致争用和低性能。特别是支持 NumPy 的大多数线性代数例程的 BLAS/LAPACK 库通常是多线程的,并且需要被告知只使用一个线程。您可以使用以下环境变量来执行此操作(使用export下面的 bash 命令,但这可能因您的操作系统而异)。

export OMP_NUM_THREADS=1
export MKL_NUM_THREADS=1
export OPENBLAS_NUM_THREADS=1

您需要在启动 Python 进程之前运行它以使其生效。

考虑 Xarray

Xarray包围绕Dask Array,因此提供了相同的可扩展性,但在处理复杂数据集时也增加了便利性。特别是 Xarray 可以帮助解决以下问题:

将多个数组作为一致的数据集一起管理

一次从一堆 HDF 或 NetCDF 文件中读取

使用一致的 API 在 Dask Array 和 NumPy 之间切换

Xarray 用于广泛的领域,包括物理学、天文学、地球科学、显微镜、生物信息学、工程、金融和深度学习。Xarray 还有一个蓬勃发展的用户社区,擅长提供支持。

构建你自己的操作
通常我们想要执行在 Dask Array 中没有确切功能的计算。在这些情况下,我们可以使用一些更通用的函数来构建我们自己的函数。这些包括:

blockwise(func, out_ind, *args[, name, ...])

张量运算:广义内积和外积

map_blocks(func, *args[, name, token, ...])

跨 dask 数组的所有块映射函数。

map_overlap(func, *args[, 深度, 边界, ...])

在有一些重叠的数组块上映射一个函数

reduction(x, 块,聚合[,轴,...]

通用版的减法

这些函数可以帮助你将你为 NumPy 函数编写的函数应用到更大的 Dask 数组上。

python基于xarray处理netcdf文件时,使用dask加速处理速度 在处理高分辨率气象文件netcdf格式文件时,常规的处理速度太慢!!数据量过大,造成卡死,真是上头!!!先不要想着新装内存,虽然我差点京东下单! 首先需要先安装好dask包!!! 1、以日数据气温数据netcdf文件为例。 图是两个打开方式,其air是气温变量。 data_dask是使用dask,chunks则是以经纬度10度为间隔划分块。进而分块处理。 data_nodask常规打开方法。 2、以按年平均举例,
在自己的电脑上处理长时间高分辨率的空间栅格数据时,经常因为数据量过大而导致代码难以运行。在使用python的xarray包处理分析数据时,可以利用dask包对较大的数据进行分块并行计算。 xarray关于dask并行运算的介绍
Pandas是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。Pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。本文主要介绍一下Pandaspandas.DataFrame.to_xarray方法的使用。 原文地址:Python pandas.DataFrame.to_xarray函数方法的使用
xarray介绍 文章目录**xarray介绍****xr.Dataset:**1、官方例子:2、同一维度上多个变量的坐标参数:xr.DataArray:1、有多个维度时(以3维为例)2、只有一个维度时**xarray--数据的读写**利用xarray读取NetCDF数据:读取nc文件:写入nc文件:**xarray--数据索引和切片**xarray--nc文件规则网格插值 xr.Dataset: 装入多个变量的信息,可以对每个变量进行定义不同的维度信息。主要包含以下三部分: data_vars 1、什么是DaskPandas和Numpy大家都不陌生了,代码运行后数据都加载到RAM,如果数据集特别大,我们就会看到内存飙升。但有时要处理的数据并不适合RAM,这时候Dask来了。 Dask是开源免费的。它是与其他社区项目(如Numpy,Pandas和Scikit-Learn)协调开发的。 官方:https://dask.org/ Dask支持Pan..
在Windows下读取grib文件,在我上一篇博客Windows上python读取grib2文件(不用Linux)学习了使用wgrib2处理grib2文件,可以直接读,也可以转化为nc文件(转化后python就容易处理了)。而对于grib文件,下载wgrib处理可以,但不能转化为nc文件。本博客学习使用xarray和cgrib读取及转化grib数据。 一、气象数据常用格式 常用的数据格式包括普通的二进制格式、文本数据、NetCDF、HDF4/5以及GRIB1/2数据。这里简单介绍一下NetCDF和GRIB1
原理就是不一次性把文件数据读入内存,而是分多次 1.指定chunksize分块读取文件 read_csv 和 read_table 有一个 chunksize 参数,用以指定一个块大小(每次读取多少行),返回一个可迭代的 TextFileReader 对象。 table=pd.read_table(path+'kuaishou.txt',sep='\t',chunksize=1000000) for df in table: 对df处理 #如df.drop(columns=['page',
xarray的实现在./lib/xarray.c xarray 的解释如下: The XArray is an abstract data type which behaves like a very large array of pointers. It meets many of the same needs as a hash or a conventional resizable a...
Dimensions: (time: 365, lat: 180, lon: 360) Coordinates: * lon (lon) float32 0.0 1.0 2.0 3.0 ... 356.0 357.0 358.0 359.0 * lat (lat) float32 -89.0 -88.0 -87.0 -86.0 ... 86.0 87.0 88.0 89.0 * time (time) datetime64[ns] 2019-01-01 2019-01-02 ... 2019-12-31 Data variables: data_var (time, lat, lon) float32 ... 在 xarray ,可以通过 `sel()` 函数选择数据集的子集,包括选择时间范围。例如,选择 2019 年 1 月 1 日至 2019 年 1 月 31 日的数据: ```python subset = ds.sel(time=slice('2019-01-01', '2019-01-31')) 其,`slice()` 函数用于指定时间范围,`time` 表示选择的是时间维度。`subset` 就是选择后的子集,可以进行后续的数据分析和处理。