производительность — лучший подход к хранению научных наборов данных на диске Переполнение стека

В настоящее время я работаю над проектом, который требует работы с гигабайтами научных наборов данных. Наборы данных представлены в виде очень больших массивов (30 000 элементов) целых чисел и чисел с плавающей запятой. Проблема здесь в том, что они слишком велики и не помещаются в память, поэтому мне нужно решение на диске для хранения и работы с ними. Чтобы сделать эту проблему еще более увлекательной, я ограничен использованием 32-разрядной архитектуры (так как это для работы), и мне нужно попытаться максимизировать производительность для этого решения.

До сих пор я работал с HDF5, который работал нормально, но я нашел его слишком сложным для работы. Итак, я подумал, что лучше всего будет попробовать базу данных NoSQL, но я не смог найти хорошего способа хранения массивов в базе данных, кроме преобразования их в символьные массивы и их хранения таким образом, что вызвало много плохой указатель головной боли.

Итак, я хотел бы знать, что вы, ребята, рекомендуете. Возможно, у вас есть менее болезненный способ работы с HDF5 и в то же время максимальная производительность. Или, может быть, вы знаете базу данных NoSQL, которая хорошо работает для хранения данных такого типа. Или, может быть, я иду в совершенно неверном направлении с этим, и вы хотели бы привнести в меня какой-то смысл.

В любом случае, я был бы признателен за любые мудрые слова, которые вы, ребята, можете мне предложить 🙂

1

Решение

Предполагая, что ваши наборы данных действительно достаточно велики (например, вместо 30 000 элементов, массива двойных 30 000 x 30 000), вы можете рассмотреть STXXL. Он предоставляет интерфейсы, которые предназначены (и в значительной степени преуспевают) в имитировании коллекций в стандартной библиотеке C ++, но предназначены для работы с данными, слишком большими для размещения в памяти.

2

Другие решения

Придайте себе смысл и используйте библиотеку промышленного уровня, такую ​​как HDF5. Таким образом, вы нашли это слишком сложным, но вы нашли его API высокого уровня ?

Если вам не нравится этот ответ, попробуйте одну из появляющихся массивов баз данных, такую ​​как SciDB, rasdaman или же MonetDB. Я подозреваю, однако, что если вы проиграли HDF5, то проиграете в любом из них.

По моему мнению и опыту, стоит научиться правильно использовать такой инструмент, как HDF5, если вы собираетесь работать с большими наборами научных данных в течение любого промежутка времени. Если вы выберете инструмент, такой как база данных NoSQL, который не был предназначен для текущей задачи, тогда, хотя он может быть изначально прост в использовании, в конечном итоге (как я догадывался очень скоро) ему не хватит необходимых вам функций или хотите, и вам придется программировать вокруг его недостатков.

Выберите один из подходящих инструментов для работы и научитесь правильно его использовать.

3

Я работал над научными вычислениями в течение многих лет, и я думаю, что HDF5 или NetCDF — это хороший формат данных для работы с вами. Он может обеспечить эффективное параллельное чтение / запись, что важно для работы с большими данными.

Альтернативное решение заключается в использовании базы данных массива, такой как SciDB, MonetDB или RasDaMan. Тем не менее, это будет немного болезненно, если вы попытаетесь загрузить данные HDF5 в базу данных массива. Однажды я пытался загрузить данные HDF5 в SciDB, но это требует серии преобразований данных. Вы должны знать, будете ли вы часто запрашивать данные или нет. Если не часто, то длительная загрузка может быть недостойной.

Вы можете быть заинтересованы в Эта бумага.
Это может позволить вам запрашивать данные HDF5 напрямую с помощью SQL.

2
По вопросам рекламы [email protected]