2009-11-02 6 views
8

Документация на модуле Bigarray несколько расплывчата. В нем указано, что целью массивов в этом модуле является хранение «больших массивов», но на самом деле он не определяет, что означает «большой массив». Когда следует использовать Bigarray над регулярным массивом? Есть ли определенное количество элементов, за которыми я должен просто использовать Bigarray? Это в тысячах? Миллионы? Миллиарды?Когда мне нужно использовать Bigarray и почему?

А что делает Bigarray лучше при работе с большими массивами? Что делает регулярный массив лучше при работе с ... не большими массивами?

+2

Возможно, это определение «большого массива» как «разреженного массива», хотя я совершенно не осведомлен о OCaml, поэтому я мог бы быть здесь waaaay. –

+0

Даже в этом случае, зачем вам нужна другая структура данных? –

+1

Редкий массив не содержит (обязательно) пробел в памяти или даже указатель на 'null' для каждого элемента массива. Если у вас есть массив из 2 миллиардов элементов, как вы предлагаете в своем вопросе, это около 8 ГБ, чисто в указателях. Если у вас есть только 5 элементов в массиве (предположительно при высоких индексах), то ваше пространство для хранения действительно должно содержать 5 указателей и принимать несколько байтов. –

ответ

10

Я нашел ответ на этот вопрос (от this page):

BigArray библиотека реализует большие, многомерные, числовые массивы. Эти массивы называются «большими массивами», чтобы отличить их от стандартных массивов Caml, описанных в модульном массиве. Основные различия между «большими массивами» и стандартных Caml массивов следующим образом:

  • Большие массивы не ограничены в размерах, в отличие от Caml массивов (массив с плавающей точкой ограничены 2097151 элементами на 32-битной платформе, другой массив типы до 4194303 элементов).
  • Большие массивы являются многомерными. Поддерживается любое число измерений от 1 до 16. Напротив, массивы Caml являются одномерными и требуют кодирования многомерных массивов в виде массивов массивов.
  • Большие массивы могут содержать только целые числа и числа с плавающей запятой, в то время как массивы Caml могут содержать произвольные типы данных Caml. Однако большие массивы обеспечивают более экономичное пространство для хранения целочисленных и с плавающей точкой элементов, в частности потому, что они поддерживают «небольшие» типы, такие как float с одной точностью и 8 и 16-битные целые числа, в дополнение к стандартным типам Caml double -precision float и 32 и 64-битные целые числа.
  • Макет памяти больших массивов полностью совместим с массивами в C и Fortran, позволяя передавать большие массивы между кодом Caml и кодом C/Fortran без копирования данных вообще.
  • Большие массивы поддерживают интересные высокоуровневые операции, которые нормальные массивы не обеспечивают эффективно, например, извлечение подмассивов и «разрезание» многомерного массива по определенным размерам, без копирования.
+0

Совместимость с C/Fortran - большой случай, который я вижу для bigarrays. Он может значительно сократить использование памяти при взаимодействии с библиотеками на основе массивов C или Fortran (например, BLAS). –

+0

Предел размера составляет 16 Мб и влияет на массивы float, массивы int и строки (которые являются массивами байтов). Большие массивы используются для размещения больших массивов на 32-битных платформах. Ваш лучший бит - использовать 64-битную платформу и забыть о больших массивах ... –

Смежные вопросы