【问题标题】:When do I need to use a Bigarray and why?我什么时候需要使用 Bigarray,为什么?
【发布时间】:2009-11-02 12:37:30
【问题描述】:

Bigarray 模块的文档有些模糊。它指出该模块中数组的目的是保存“大数组”,但它并没有真正定义“大数组”的含义。什么时候应该在常规数组上使用 Bigarray?是否有一定数量的元素,我应该只使用 Bigarray?数以千计吗?百万?数十亿?

是什么让 Bigarray 更擅长处理大数组?是什么让常规数组更擅长处理...非大数组?

【问题讨论】:

  • 可能是它把一个“大数组”定义为一个“稀疏数组”,虽然我对 OCaml 完全一无所知,所以我可以离开这里。
  • 即使在那种情况下,你为什么需要不同的数据结构?
  • 稀疏数组(不一定)在内存中保存空间,甚至不是数组中每个元素的指向null 的指针。如果您有一个包含 20 亿个元素的数组,正如您在问题中所建议的那样,那么这大约是 8GB 的​​价值,纯粹是指针。如果数组中实际上只有 5 个项目(大概在高索引处),那么您的存储空间实际上只需要容纳 5 个指针并占用少量字节。
  • 如果您的数组中实际上有 20 亿个项目,那么无论是稀疏数组还是普通数组都无关紧要,您同样被搞砸了,需要寻找一种新方法存储您的数据。
  • @Matt - 哇,这完全有道理。我很惊讶我以前没有听说过稀疏数组。但话又说回来,我通常不做那种编程。 :-)

标签: arrays ocaml


【解决方案1】:

我找到了答案(来自this page):

bigarray 库实现大型多维数值数组。这些数组被称为“大数组”,以区别于模块数组中描述的标准 Caml 数组。 “大数组”与标准Caml数组的主要区别如下:

  • 大数组的大小不受限制,这与 Caml 数组不同(浮点数组在 32 位平台上限制为 2097151 个元素,其他数组类型限制为 4194303 个元素)。
  • 大数组是多维的。支持 1 到 16 之间的任意数量的维度。相比之下,Caml 数组是一维的,需要将多维数组编码为数组的数组。
  • 大数组只能包含整数和浮点数,而 Caml 数组可以包含任意 Caml 数据类型。然而,大数组提供了更节省空间的整数和浮点元素存储,特别是因为它们支持“小”类型,例如单精度浮点数和 8 位和 16 位整数,除了标准的 Caml 类型的 double -precision 浮点数以及 32 位和 64 位整数。
  • 大数组的内存布局与 C 和 Fortran 中的数组完全兼容,允许大数组在 Caml 代码和 C/Fortran 代码之间来回传递,根本不需要数据复制。
  • 大数组支持普通数组无法有效提供的有趣的高级操作,例如提取子数组和沿特定维度“切片”多维数组,所有这些操作都无需任何复制。

【讨论】:

  • 与 C/Fortran 的兼容性是我看到的 bigarrays 的主要案例。与基于 C 或 Fortran 数组的库(例如 BLAS)交互时,它可以显着减少内存使用量。
  • 大小限制为 16Mb,影响浮点数组、整数数组和字符串(字节数组)。大数组用于允许 32 位平台上的大数组。你最好的一点是使用 64 位平台,忘记大数组......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 2012-09-16
  • 2010-09-21
  • 2018-02-25
  • 1970-01-01
  • 2021-09-04
相关资源
最近更新 更多