Мнения о NetCDF и HDF5 для хранения научных данных?

Кто-нибудь имеет достаточно опыта работы с NetCDF и HDF5, чтобы рассказать о них как о способе хранения научных данных?

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

edit: мое приложение предназначено только для регистрации данных, поэтому я получаю файл в формате с самоописанием. Для меня важными функциями являются возможность добавлять произвольные метаданные, иметь быстрый доступ на запись для добавления к байтовым массивам и иметь одновременный доступ с одним записывающим / множественным читателем (настоятельно рекомендуется, но не обязательно. Документы NetCDF говорят, что у них есть SWMR, но не не говорят, поддерживают ли они какой-либо механизм, гарантирующий, что два писателя не могут открыть один и тот же файл одновременно с катастрофическими результатами). Мне нравится иерархический аспект HDF5 (в частности, я люблю иерархию направленного ациклического графа, гораздо более гибкую, чем иерархия, подобная «обычной» файловой системе), сейчас читаю документы NetCDF ... если он позволяет использовать только один набор данных для каждого файла, то, вероятно, для меня это не сработает. :(

обновление выглядит так, как будто NetCDF-Java читает из netCDF -4 файла, но записывает только из файлов netCDF-3, которые не поддерживают иерархические группы. штопать.

обновление 2009-июл-14: я начинаю сильно расстраиваться из-за HDF5 в Java. Доступная библиотека не так уж и хороша, и в ней есть несколько основных препятствий, связанных с уровнями абстракции Java (составными типами данных). Отличный формат файла для C, но похоже, что я просто проиграл. > :(


person Jason S    schedule 02.07.2009    source источник
comment
постскриптум: HDF5 намного проще использовать в Python с PyTables, чем в Java.   -  person Jason S    schedule 11.11.2014
comment
К сожалению для пользователей Java, и netCDF, и HDF5 разработаны на C, в первую очередь для пользователей C или Fortran. Большинство других API, таких как Python, построены на уровне C.)   -  person Edward Hartnett    schedule 15.06.2016
comment
@EdwardHartnett - Я не верю этому аргументу. Конечно, это означает, что вы не получите никаких хороших функций Java бесплатно, но люди сделали решительный шаг, чтобы создать полезные API-интерфейсы на Python. Нет причин, по которым кто-то не мог сделать это на Java. (На самом деле, я сделал это сам - в небольшой степени - в бывшей компании, когда я разместил этот вопрос еще в 2009 году, но у меня нет доступа к этому коду.)   -  person Jason S    schedule 16.06.2016


Ответы (7)


Я настоятельно рекомендую вам HDF5 вместо NetCDF. NetCDF плоский, и через некоторое время он становится очень грязным, если вы не можете классифицировать материал. Конечно, классификация также является предметом споров, но, по крайней мере, у вас есть такая гибкость.

Мы провели точную оценку HDF5 и NetCDF, когда я написал Q5Cost, и окончательный результат был для HDF5 безоговорочно.

person Stefano Borini    schedule 15.07.2009
comment
ответ устарел - netCDF теперь построен на HDF5 - person Abe; 11.10.2013
comment
@abe не обязательно. netcdf4 все еще имеет некоторую обратную совместимость с netcdf3. это означает, что некоторые параметры сжатия по-прежнему недоступны для файлов NC. - person badgley; 11.10.2013
comment
@badgley - какие параметры сжатия отсутствуют в netCDF при использовании его для записи файлов netCDF-4? - person Sean A.; 21.04.2015
comment
@StefanoBorini Было бы здорово, если бы вы могли уточнить, применима ли ваша оценка к NetCDF-4 / HDF5 или только к более ранним версиям. - person thespinkus; 20.04.2016
comment
NetCDF-4 предоставляет почти все возможности HDF5, включая сжатие. H5utils будет работать с файлами netCDF-4, которые также являются совершенно корректными файлами HDF5. - person Edward Hartnett; 03.05.2016

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

«H» в HDF5 означает «иерархический», что переводится (во всяком случае для меня) в ДЕЙСТВИТЕЛЬНО простой способ манипулировать данными, просто перемещая узлы и ссылаясь на узлы из других мест.

Могу я спросить, что это за проект? Я использую их для множества задач научного моделирования высокопроизводительных вычислений. Могу я предположить, что вы делаете то же самое? Если это так, то я наблюдаю тенденцию к тому, что люди переходят на HDF5, но в вашей конкретной области все может быть иначе.

Как бы то ни было, удачи вам!

person Mike    schedule 02.07.2009
comment
afaik, NetCDF4 - это своего рода упрощенный HDF5, так что он знаком тем, кто использовал предыдущие версии NetCDF. unidata.ucar.edu/mailing_lists/archives/netcdfgroup/2010/ - person mdsumner; 24.12.2010
comment
Это так, но они больше пытаются навязать структуру, чем тупить - unidata.ucar.edu/software/netcdf/docs/. - person thespinkus; 20.04.2016
comment
NetCDF-4 предоставляет почти все функции HDF5, за исключением некоторых мелких непонятных исключений. - person Edward Hartnett; 03.05.2016

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

HDF5 чрезвычайно многофункциональный и обладает некоторыми отличными характеристиками производительности.

NetCDF имеет более простой API и гораздо более широкую базу инструментов. Есть много инструментов, которые обрабатывают данные netCDF.

person Edward Hartnett    schedule 18.07.2011
comment
В последний раз я проверял, что библиотека Java не позволяет записывать файлы HDF5. В любом случае, это спорный вопрос, поскольку я перешел к другим вещам. : - / - person Jason S; 18.07.2011
comment
Спасибо за лаконичный ответ, это очень полезная информация, хотя было бы еще лучше, если бы на нее были ссылки :) - person naught101; 17.10.2013
comment
может читать и записывать большинство файлов HDF5. Нет, не может. NetCDF4 использует HDF5 так же, как приложение использует файловую систему. Он читает и записывает определенную структуру, наложенную на HDF5 1.8. - person thespinkus; 20.04.2016
comment
NetCDF-4 может читать все файлы HDF5, которые не используют ссылки или имеют круговую групповую структуру. Полный список ограничений для файлов HDF5, которые может читать netCDF-4, см. В FAQ: unidata.ucar.edu/software/netcdf/docs/ - person Edward Hartnett; 07.05.2016

Я знаю, что это более старый пост, и исходный постер указал, что они перешли, но для всех, кто здесь оказался ... библиотека netCDF-Java (начиная с 4.3.13) имеет поддержку записи netCDF-4 через Библиотека netCDF C. Он все еще находится в стадии бета-тестирования, но он работает, и мы, безусловно, приветствуем обратную связь. !

Дополнительные сведения см. В справке по netCDF-Java. .

person Sean A.    schedule 26.05.2013

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

Позднее редактирование: для NetCDF теперь существует Parallel NetCDF от Argonne. Он работает достаточно хорошо, и команда разработчиков довольно активно работает над его дальнейшим улучшением.

person Phil Miller    schedule 02.07.2009
comment
Параллельный ввод-вывод также напрямую поддерживается библиотекой Unidata netCDF, которая использует либо HDF5, либо parallel-netcdf для обеспечения параллельного ввода-вывода. - person Edward Hartnett; 03.05.2016

1) Библиотека Netcdf-4 C - это слой поверх библиотеки HDF-5 C. API считается более простым, чем библиотека HDF5, но в конечном итоге у вас почти такая же функциональность. Netcdf не поддерживает графики, а HDF5 поддерживает. На самом деле, я думаю, HDF не предотвращает циклы на вашем графике.

2) группа HDF имеет Java API поверх библиотеки HDF-5 C.

3) Unidata имеет библиотеку Netcdf-Java, которая является чистой Java, но может читать только HDF-5.

person John Caron    schedule 01.12.2011
comment
Поскольку HDF5 не поддерживает общие размеры, есть аргумент (отказ от ответственности: мной), что вам следует писать netCDF-4, а не напрямую HDF5, подробности здесь: unidata.ucar.edu/blogs/developer/en/entry/dimensions_scales. - person John Caron; 19.10.2015

NetCDF, который переводит HDF5 в свою собственную модель данных, выглядит и отлично работает ... пока вы не обнаружите, что NetCDF не поддерживает беззнаковые значения! См. Также мой вопрос о том, как определять беззнаковые значения в существующих файлах HDF5 с помощью NetCDF.

Обновление: На самом деле оказывается, что, хотя NetCDF-3 не поддерживает подписанные значения, NetCDF-4 поддерживает подписанные значения, хотя API NetCDF в Java для определения подписи имеет немного запутано.

person Garret Wilson    schedule 30.04.2013
comment
Гм ... половина вашего ответа говорит, что NetCDF не поддерживает значения беззнаковые, а другая половина предполагает, что он не поддерживает значения подписанные. Что это будет? Первая ссылка говорит только о том, что NetCDF 3 не имеет беззнаковых целых чисел, как правило, не значений. Кроме того, вторая ссылка указывает на то, что проблема связана с java, а не с netCDF4. Да и вообще какое это имеет значение? Это означает, что у вас вдвое меньше целых чисел для индексации, но у вас все еще есть 2 ^ 31 (= 2 миллиарда) или 2 ^ 63 (9 * 10 ^ 18), в зависимости от вашей системы. - person naught101; 17.10.2013
comment
Чтобы уточнить, библиотека netCDF-4 C поддерживает целые числа без знака (8, 16, 32 и 64 бит). Библиотека netCDF Java не может создавать беззнаковые типы, но может читать беззнаковые типы размером 8, 16 и 32 бита, повышая их до знаковых типов следующего большего размера. (То есть 16-битовое целочисленное поле без знака в файле netCDF будет выглядеть как 32-битное поле со знаком в java.) Это все из-за того, что Java не поддерживает беззнаковые типы. - person Edward Hartnett; 03.05.2016