2009-11-02 12 views
8

Dokumentacja na module Bigarray jest nieco niejasna. Stwierdza, że ​​celem tablic w tym module jest trzymanie "dużych tablic", ale tak naprawdę nie definiuje, co to znaczy "duża tablica". Kiedy powinienem używać Bigarraya na zwykłej tablicy? Czy istnieje pewna liczba elementów, poza którymi powinienem po prostu użyć Bigarray? Czy to w tysiącach? Miliony? Miliardy?Kiedy należy korzystać z Bigarray i dlaczego?

A co sprawia, że ​​Bigarray lepiej radzi sobie z dużymi tablicami? Co sprawia, że ​​regularna tablica lepiej radzi sobie z ... nie-dużymi tablicami?

+2

Możliwe, że definiuje on "dużą tablicę" jako "rzadką macierz", choć zupełnie nie znam się na OCaml, więc mógłbym tu zostać. –

+0

Nawet w takim przypadku, dlaczego potrzebowałbyś innej struktury danych? –

+1

Tablica rzadka nie musi (koniecznie) zawierać spacji w pamięci ani nawet wskaźnika do 'null' dla każdego elementu w tablicy. Jeśli masz w swoim pytaniu wachlarz 2 miliardów elementów, to jest to około 8GB wartości, tylko w wskaźnikach. Jeśli jednak w tablicy znajduje się tylko 5 elementów (przypuszczalnie w wysokich indeksach), to przestrzeń pamięciowa musi tylko zawierać 5 wskaźników i zajmować garść bajtów. –

Odpowiedz

10

znalazłem odpowiedź na to (od this page):

bigarray biblioteka implementuje dużych, wielowymiarowych tablic numerycznych. Tablice te nazywane są "dużymi tablicami", aby odróżnić je od standardowych tablic Caml opisanych w Module Array. Główne różnice pomiędzy „dużymi tablicami” i standardowych tablic Caml są następujące:

  • Wielkie tablice nie są ograniczone pod względem wielkości, w przeciwieństwie do tablic Caml (array pływak są ograniczone do 2097151 elementów na platformie 32-bitowej, inną tablicę typy do 4194303 elementów).
  • Duże tablice są wielowymiarowe. Obsługiwana jest dowolna liczba wymiarów od 1 do 16. W przeciwieństwie do tego, tablice Caml są jednowymiarowe i wymagają kodowania wielowymiarowych tablic jako tablic tablic.
  • Duże tablice mogą zawierać tylko liczby całkowite i liczby zmiennoprzecinkowe, a tablice Caml mogą zawierać dowolne typy danych Caml. Jednak duże tablice zapewniają bardziej efektywne przestrzennie przechowywanie elementów całkowitoliczbowych i zmiennoprzecinkowych, w szczególności dlatego, że obsługują one "małe" typy, takie jak pływaki o pojedynczej precyzji oraz liczby 8 i 16-bitowe, oprócz standardowych typów podwójnych kamer Caml. -precision floats oraz 32- i 64-bitowe liczby całkowite.
  • Układ pamięci dużych tablic jest w pełni zgodny z układem tablic w językach C i Fortran, umożliwiając przekazywanie dużych tablic między kodem Caml i C/Fortran bez kopiowania danych.
  • Duże tablice obsługują ciekawe operacje na wysokim poziomie, których normalne macierze nie zapewniają wydajnie, takie jak wyodrębnianie pod-tablic i "cięcie" wielowymiarowej tablicy wzdłuż pewnych wymiarów, a wszystko to bez żadnego kopiowania.
+0

Zgodność z C/Fortran to wielki przypadek, który widzę dla bigarrays. Może radykalnie zmniejszyć wykorzystanie pamięci podczas łączenia się z bibliotekami opartymi na tablicach C lub Fortran (np. BLAS). –

+0

Ograniczenie rozmiaru wynosi 16 MB i dotyczy tablic float, tablic int i łańcuchów (które są tablicami bajtów). Duże tablice są używane, aby umożliwić duże tablice na platformach 32-bitowych. Najlepiej jest użyć platformy 64-bitowej i zapomnieć o dużych tablicach ... –

Powiązane problemy