2009-11-02 4 views
8

La documentation sur le module Bigarray est quelque peu vague. Il indique que le but des tableaux dans ce module est de contenir de "grands tableaux", mais il ne définit pas vraiment ce que cela signifie par "grand tableau". Quand devrais-je utiliser un Bigarray sur un tableau régulier? Y a-t-il un certain nombre d'éléments au-delà desquels je devrais utiliser un Bigarray? Est-ce dans les milliers? Des millions? Des milliards?Quand dois-je utiliser un Bigarray et pourquoi?

Et qu'est-ce qui rend un Bigarray meilleur dans le traitement des grandes baies? Qu'est-ce qui fait qu'un tableau régulier est mieux adapté aux tableaux non-grands?

+2

Il se peut qu'il définisse un «grand tableau» comme un «tableau fragmenté», bien que j'ignore complètement OCaml, donc je pourrais être ici au large. –

+0

Même dans ce cas, pourquoi auriez-vous besoin d'une structure de données différente? –

+1

Un tableau clairsemé ne contient pas (nécessairement) un espace en mémoire, ni même un pointeur sur 'null' pour chaque élément du tableau. Si vous avez un tableau de 2 milliards d'éléments comme vous le suggérez dans votre question, cela représente une valeur de 8 Go, purement indicative. Si vous ne disposez que de 5 éléments dans le tableau (vraisemblablement à des index élevés), alors votre espace de stockage ne doit contenir que 5 pointeurs et occuper une poignée d'octets. –

Répondre

10

Je trouve la réponse à cette (de this page):

La bibliothèque Bigarray implémente grandes, multidimensionnels, tableaux numériques. Ces tableaux sont appelés "grands tableaux" pour les distinguer des tableaux Caml standard décrits dans Module Array. Les principales différences entre les « grands tableaux » et des tableaux standards Caml sont les suivantes:

  • tableaux grands ne sont pas limités en taille, à la différence des réseaux de Caml (réseau de flotteurs sont limités à 2097151 éléments sur une plate-forme 32 bits, autre tableau types à 4194303 éléments).
  • Les grands tableaux sont multidimensionnels. N'importe quel nombre de dimensions entre 1 et 16 est supporté. En revanche, les tableaux Caml sont monodimensionnels et nécessitent des tableaux multidimensionnels de codage sous forme de tableaux de tableaux.
  • Les grands tableaux ne peuvent contenir que des entiers et des nombres à virgule flottante, alors que les tableaux Caml peuvent contenir des types de données arbitraires Caml. Cependant, les grands tableaux offrent un stockage plus efficace des éléments entiers et à virgule flottante, en particulier parce qu'ils prennent en charge des types "petits" tels que des flottants de précision simple et des entiers de 8 et 16 bits, en plus des types de double standard Caml. -précisions flottantes et entiers 32 et 64 bits.
  • La disposition de la mémoire des grandes baies est entièrement compatible avec celle des baies en C et Fortran, permettant de passer d'un grand nombre de baies entre le code Caml et le code C/Fortran sans aucune copie de données.
  • Les grandes baies supportent des opérations de haut niveau intéressantes que les baies normales ne fournissent pas efficacement, telles que l'extraction de sous-rangées et le "découpage" d'une matrice multidimensionnelle selon certaines dimensions, sans aucune copie.
+0

La compatibilité avec C/Fortran est le gros cas que je vois pour bigarrays. Il peut réduire considérablement l'utilisation de la mémoire lors de l'interfaçage avec des bibliothèques basées sur des matrices C ou Fortran (par exemple, BLAS). –

+0

La taille limite est de 16 Mo et affecte les tableaux flottants, les tableaux int et les chaînes (qui sont des tableaux d'octets). Les grands tableaux sont utilisés pour autoriser de grands tableaux sur des plates-formes 32 bits. Votre meilleur atout est d'utiliser une plate-forme 64 bits et oublier les grandes baies ... –

Questions connexes