Каковы недостатки использования файлов .Rdata по сравнению с HDF5 или netCDF?

StackOverflow https://stackoverflow.com/questions/7838027

  •  27-10-2019
  •  | 
  •  

Вопрос

Меня попросили изменить программное обеспечение, которое в настоящее время экспортирует файлы .Rdata, чтобы оно экспортировало в «независимый от платформы двоичный формат», такой как HDF5 или netCDF.Были названы две причины:

  1. Файлы Rdata могут быть прочитаны только R
  2. двоичная информация хранится по-разному в зависимости от операционной системы или архитектуры.

Я также обнаружил, что «Руководство по импорту и экспорту данных R» не обсуждаются файлы Rdata, хотя обсуждаются HDF5 и netCDF.

А обсуждение R-help предполагает, что файлы .Rdata не зависят от платформы.

Вопросы:

  1. Насколько обоснованны эти опасения?
    • напримерможет ли Matlab читать .Rdata без вызова R?
  2. Являются ли другие форматы более полезными в этом отношении, чем файлы .Rdata?
  3. Можно ли написать скрипт, который создавал бы .hdf5-аналоги всех .Rdata-файлов, минимизируя изменения в самой программе?
Это было полезно?

Решение

Вот разнообразные ответы:

  1. Множество вариантов Во-первых, опасения обоснованы, но ваш список вариантов немного уже, чем должен быть.HDF5/netCDF4 — отличный вариант, хорошо работающий с Python, Matlab и многими другими системами.HDF5 во многих отношениях превосходит хранилище Pickle в Python — посмотрите PyTables, и вы, скорее всего, увидите хорошее ускорение.Раньше у Matlab были (и могут быть) некоторые проблемы с тем, как большие массивы ячеек (или, возможно, структур) хранятся в HDF5.Дело не в том, что он не мог этого сделать, а в том, что это было чертовски медленно.Это проблема Matlab, а не HDF5.Хотя это отличный выбор, вы также можете подумать, подходит ли HDF5:подумайте, есть ли у вас очень большие файлы, и вам может быть полезно использовать собственную кодировку для скорости доступа или сжатия.Не так уж сложно создать необработанное двоичное хранилище на любом языке, и вы можете легко спроектировать что-то вроде файлового хранилища bigmemory (т.е.скорость доступа).На самом деле, вы могли бы даже использовать bigmemory файлы на других языках — это действительно очень простой формат.HDF5, безусловно, является хорошей отправной точкой, но не существует единого универсального решения для хранения и доступа к данным. особенно когда мы добираемся до очень больших наборов данных.(Для небольших наборов данных вы также можете взглянуть на протокольные буферы или другие форматы сериализации;Дирк сделал RProtoBuf для доступа к ним в R.) Информацию о сжатии см. в следующем предложении.

  2. Размер Как упомянул Дирк, форматы файлов можно охарактеризовать как нейтральные и зависящие от приложения.Другая ось — это независимое от домена (или не зависящее от домена) или зависимое от домена (умное ;-) хранилище.Если у вас есть некоторые знания о том, как будут создаваться ваши данные, особенно любая информация, которую можно использовать при сжатии, вы, возможно, сможете создать лучший формат, чем все, что могут сделать стандартные компрессоры.Это требует некоторой работы.Альтернативные компрессоры, отличные от gzip и bzip, также позволяют анализировать большие объемы данных и разрабатывать соответствующие «словари» сжатия, что позволяет добиться гораздо лучшего сжатия, чем при использовании файлов .Rdat.Для многих типов наборов данных сохранение разницы между разными строками таблицы является лучшим вариантом — это может привести к гораздо большей сжимаемости (например,может появиться много нулей), но только вы знаете, сработает ли это для ваших данных.

  3. Скорость и доступ .Rdat не поддерживает произвольный доступ.Он не имеет встроенной поддержки параллельного ввода-вывода (хотя при желании вы можете сериализовать его в хранилище параллельного ввода-вывода).Есть много вещей, которые можно было бы сделать здесь, чтобы улучшить ситуацию, но это тысяча сокращений, чтобы приклеивать что-то к .Rdat снова и снова, вместо того, чтобы просто переключаться на другой механизм хранения и устранять проблемы со скоростью и доступом.(Это не просто преимущество HDF5:Я часто использовал многоядерные функции для распараллеливания других методов ввода-вывода, таких как bigmemory.)

  4. Обновление возможностей В R нет удобного способа добавления объектов в файл .Rdat.Насколько мне известно, он не предлагает никаких «Просмотров», позволяющих пользователям визуально проверять или искать в коллекции файлов .Rdat.Насколько мне известно, он не предлагает каких-либо встроенных средств управления версиями объектов в файле.(Я делаю это с помощью отдельного объекта в файле, в котором записаны версии сценариев, сгенерировавших объекты, но в будущей итерации я передам это SQLite.) Все это есть в HDF5.(Также произвольный доступ влияет на обновление данных - файлы .Rdat, приходится сохранять весь объект.)

  5. Коммунальная поддержка Хотя я и защищаю ваш собственный формат, он предназначен для данных экстремального размера.Наличие библиотек, созданных для многих языков, очень помогает уменьшить трудности при обмене данными.Для большинства простых наборов данных (а в большинстве случаев «простой» по-прежнему означает «довольно сложный») или наборов данных среднего и довольно большого размера HDF5 является хорошим форматом.Конечно, есть способы обойти это на специализированных системах.Тем не менее, это хороший стандарт, который будет означать, что будет затрачено меньше организационных усилий на поддержку проприетарного формата или формата, специфичного для приложения.Я видел, как организации придерживались формата в течение многих лет после использования приложения, сгенерировавшего данные, только потому, что для загрузки и сохранения в формате этого приложения было написано так много кода, а в этом формате уже хранились ГБ или ТБ данных ( когда-нибудь это может быть вы и R, но это возникло из другого статистического набора, который начинается с буквы «S» и заканчивается буквой «S» ;-)).Это очень серьезное препятствие для будущей работы.Если вы используете широко распространенный стандартный формат, вы можете гораздо проще переносить его с другими широко распространенными стандартами:вполне вероятно, что кто-то еще решил решить ту же проблему.Попробуйте — если вы выполняете конвертер сейчас, но на самом деле не конвертируете его для использования, по крайней мере, вы создали инструмент, который другие могут подобрать и использовать, если наступит момент, когда необходимо перейти на другой формат данных. .

  6. Память При использовании файлов .Rdat вам необходимо load или attach это для доступа к объектам.Большую часть времени люди load файл.Ну а если файл очень большой, то оперативки уходит много.Итак, любой из них немного умнее использовать attach или разделяет объекты на несколько файлов.Это довольно неудобно для доступа к мелким частям объекта.С этой целью я использую отображение памяти.HDF5 обеспечивает произвольный доступ к частям файла, поэтому вам не нужно загружать все данные только для доступа к небольшой части.Это всего лишь часть того, как все работает.Таким образом, даже в R есть варианты получше, чем просто файлы .Rdat.

  7. Скрипты для конвертации Что касается вашего вопроса о написании скрипта - да, вы можете написать скрипт, который загружает объекты и сохраняет их в HDF5.Однако не обязательно делать это с огромным набором разнородных файлов, если у вас нет хорошего понимания того, что будет создано.Я не мог начать проектировать это для своих собственных наборов данных:там слишком много одноразовых объектов, и создавать огромную библиотеку файлов HDF5 было бы нелепо.Лучше думать об этом как о запуске базы данных:что вы хотите сохранить, как вы будете это хранить и как это будет представлено и как к нему будет осуществляться доступ?

Разработав план преобразования данных, вы сможете использовать такие инструменты, как Hadoop, или даже базовые функции многоядерности, чтобы запустить программу преобразования и сделать это как можно быстрее.

Суммируя, даже если ты останешься в R, вам рекомендуется рассмотреть другие возможные форматы хранения, особенно для больших, растущих наборов данных.Если вам необходимо поделиться данными с другими или, по крайней мере, предоставить доступ для чтения или записи, то настоятельно рекомендуется использовать другие форматы.Нет смысла тратить время на поддержку программ чтения/записи для других языков – это просто данные не код.:) Сосредоточьте свой код на том, как разумно манипулировать данными, а не тратить время на работу с хранилищем — другие люди уже очень хорошо с этим справились.

Другие советы

(Двоичные) форматы файлов бывают двух основных вкусов:

  • приложение-нейтральное, поддерживаемые публичными библиотеками и API (и NetCDF и HDF5 попадают в этот лагерь), которые облегчают обмен данными между различными программами и приложениями при условии, что они расширены с помощью дополнительных пакетов с использованием API

  • Специфичный для приложения только предназначены только для работы с одной программой, хотя и более эффективно: вот что делает .rdata

Поскольку R является открытым исходным кодом, вы можете воссоздать формат для RDATA из ваших файлов MATLAB: ничто не мешает вам написать правильный файл MEX. Может быть, кто -то уже сделал это уже. Не существует технической причины не пытаться-но другой маршрут может быть проще, если оба приложения предназначены для того, чтобы обмениваться данными, поддерживая формат одинаково хорошо.

Для того, что это стоит, в начале/середине 1990-х я написал свой собственный код C, чтобы написать файлы моделирования в двоичном формате, используемом Octave (который я использовал, затем нарезал данные). Возможность сделать это с помощью программного обеспечения с открытым исходным кодом - большой плюс.

Я думаю, что могу ответить на некоторые, но не на все эти вопросы.

  1. Ну, любой, кто придает ему мнение, может прочитать .Rdata Файл напрямую, но это тяжелая работа и не большая выгода. Поэтому я сомневаюсь, что Matlab сделал это. Как вы можете помнить, R может прочитать различные другие форматы системы именно потому, что кто -то приложил много усилий для этого.

  2. Для текстовых форматов CSV кажутся довольно «стандартными», но для двоичных форматов я не знаю - и CSV не является хорошим стандартом в этом - он сильно варьируется, как (особенно) даты и цитаты обрабатываются (и, конечно, он работает только для таблицы данных).

  3. Конечно!

Пример:

for(f in list.files(".", pattern="\\.Rdata$") {
    e <- new.env()
    load(f, e)       # load all values into environment e
    x <- as.list(e)

    #saveInOtherFormat(x, file=sub("\\.Rdata$", ".Other", f))
}

Точка 2 неверна: двоичные. находятся Портативные на платформах оборудования и ОС. Цитировать со страницы справки? Сохранить:

Все платформы R используют представление XDR (Bigendian) C Ints and Double в двоичных файлах Save-D, и они портативны на всех платформах R.

Точка 1 является функцией того, что являются данными, и какие другие программы могут применяться к данным. Если база вашей кода использует save () для записи указанных объектов, которые являются DataFrames или Matrices, вы можете легко написать небольшую функцию save2hdf (), чтобы записать их в виде двоичных файлов HDF или NCDF, затем используйте SED, чтобы изменить все входы сохранения (на сохранение (на сохранение (на сохранение (на сохранение (на сохранение (на Save2hdf (в вашей кодовой базе. По крайней мере, у NCDF будет нанесение производительности на чтениях, но не так уж и плохо. Если в вашем коде используются сохраненные объекты, такие как списки гетерогенных объектов, вы, вероятно, не можете использовать NCDF или HDF без отличия. Сделка перекодирования, чтобы написать отдельные компонентные объекты.

Также обратите внимание, что NetCDF 4 по -прежнему проблематичен в R.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top