8
\ begingroup美元

我读了医生但还是不知道

  • 启用或禁用shuffle有什么好处?

  • 哪个级别(0-9)的压缩是最优的?

  • 块大小的最佳选择是什么?

\ endgroup美元

    1回答1

    12
    \ begingroup美元

    我在我的平板电脑上拍了一些图片,以便更好地解释这一切。很抱歉,他们不是那么好。

    洗牌

    如果不进行洗牌,则逐个存储值(float, double, integer, short integer,…)。因此,每个变量本身都连续地存储在内存中。第二个值的第一位紧跟着第一个值的最后一位。如果我们使用洗牌,第一点所有变量连续存储在空间中,后面跟着第二个位,依此类推。

    在这里输入图像描述

    上图显示了一个由6个8位整数组成的数组(只有8位,因为绘制工作较少;-))。垂直的黑盒子分成8个隔间,表示一个8位整数。从左到右的橙色箭头表示如何通过洗牌来存储比特。

    现在我们假设一些示例值:我们有一个值为4、2、4、5、7和6的数组。如下图所示。第一行显示十进制表示。下面的矩阵是二进制表示。每个二进制列表示第一行中相应的十进制数。红色箭头表示正常的存储顺序。橙色箭头表示打乱存储顺序。

    在这里输入图像描述

    现在我们可以写出内存中位的顺序。我想用颜色。因此,你得到了另一幅图:

    在这里输入图像描述

    我们在每个值的二进制表示的开头有很多零(因为我们的值非常低)。在这种情况下,洗牌是有利的,因为我们有一个很长的连续内存部分充满了相同的内容数字/条件(= 0)。

    如果我们没有低的数字,只有彼此接近的高的数字,我们就不会有一个长而连续的内存部分,里面充满了0,但它可能是6个1,然后是6个0。通常在netCDF文件中,我们有更大的数组。让我们假设一个4元数组,其中有100 x 200 x 30 x 365个值,它们彼此非常相似。然后通常是2.19 x 109内存中连续的1或0,这对于压缩来说非常好。

    但是,如果相邻值相差很大,则洗牌可能不是一个好主意。

    组块

    如果我们有一个未压缩的文件(=没有分块;(或一个大块),一个n-dim数组连续存储在内存中:首先,数组的第一行(第一个索引)的所有值连续存储在内存中;然后我们转到下一行(将第二个索引增加1),并将第二行连续写入内存;等等......

    我们也可以从最后一个索引开始,然后反过来做……-取决于编程语言和定义什么是.但原理是一样的。

    下图显示了一个具有一个空间维度和一个时间维度的2-dim变量的示例。红色箭头表示数据如何在内存中对齐。黑点是我们的2-dim数组中的单个值。

    在这里输入图像描述

    现在,我们想从数据中提取一个时间片(一个时间步长的所有空间值)和一个空间片(一个位置的所有时间值)。在第二种情况下,我们得到一个时间序列(可以是模型数据的时间序列)。在第一种情况下,我们获得当前情况的图片(可能是地图)。下图中蓝色和绿色的标记表示时间和空间切片。

    在这里输入图像描述

    时间片和空间片的区别如下。时间片的提取速度很快,因为这些值连续地存储在内存中。空间切片需要更多的时间,因为只提取每六个值。这个例子是额外的吗工作/时间消费很低。然而,如果我们有一个大的4-dim变量,时间片提取将比空间片提取快。

    当我们压缩数据时,我们可以把它分成块。这意味着,我们将大数组变量拆分为子数组。对于用户来说,它从外面看起来是一样的。当我们压缩数据但不定义分块模式时,netCDF-4会自动分块。

    下图显示了一个示例,其中我们的数据被分成三个块。红色箭头表示我们的值在内存中的对齐。这只是一个典型的对齐。

    在这里输入图像描述

    现在,我们再次提取时间和空间切片(下图)。绿色和蓝色表示切片。这里我们看到空间切片将会很大更容易/更快提取之前。但是,时间片的提取将花费更多的时间。

    在这里输入图像描述

    此外,当您更改块大小时,压缩也会有所不同。背景与中描述的相似洗牌Section:根据相邻的值,一个或另一个分块可能是有利的。

    现在回答你的问题:块大小的最佳选择是什么?

    关注使用

    这取决于您的数据使用情况和访问模式。如果您经常在特定位置提取时间序列,那么以一种与一个位置对应的值在内存中对齐的方式定义块可能是有利的。

    但是要小心,像cdo这样的软件总是以同样的方式访问netCDF数据——与你在处理过程中对它做的事情无关。因此,如果您不通过C-或Fortran-netCDF4例程直接访问文件,而是通过其他一些软件,则最好的分块模式可能不取决于你想做什么,而是取决于软件如何做... .例如,有些软件可能总是首先沿着空间维度读取数据,尽管您希望沿着时间维度读取数据。

    关注压缩:

    压缩文件的大小随分块布局的不同而不同。这种情况与Shuffle一节中描述的情况类似。如果数据在时间维度上更有效地压缩,那么上面示例图中的分块可能对文件大小有利(例如,空间上的高可变性但时间上的低可变性)。

    组块的总结

    块大小的最佳选择取决于您的访问模式、您使用的软件、您的数据本身以及您关注的焦点访问时间vs.存储空间

    压缩级别

    压缩级别的选择取决于您的目标。如果您只想存储数据(在存档中或任何地方)并使其尽可能小,则可以使用压缩级别9。

    如果希望经常快速地访问数据,则应该选择较低的压缩级别。我们使用最高4级的压缩级别。在此之上,文件大小的减少是非常低的(对我们来说),所以我们没有理由超过。

    例子:目前,我正在研究一个海洋模型。我们在模型域中有很多土地(大约1/3)。级别1的压缩足以将文件大小减少大约95%。然而,这是一个特例。

    简介:

    我试着概述一下你所要求的功能。确切的选择取决于您的特定用例,不能一概而论。对你来说,我的回答可能太晚了,但我希望它可以帮助其他人。对于我来说,您链接的文件在过去帮助很大。

    \ endgroup美元
    1
    • 1
      \ begingroup美元 谢谢。该死,我还希望能得到那顶“沉默”的帽子呢……;-) \ endgroup美元
      - - - - - -daniel.heydebreck
      2017年12月19日21:04

    你的答案

    点击“发表您的答案”,即表示您同意我们的服务条款隐私政策饼干的政策

    不是你想要的答案吗?浏览其他有标签的问题问自己的问题