Каковы недостатки использования файлов .Rdata по сравнению с HDF5 или netCDF? - PullRequest
27 голосов
/ 20 октября 2011

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

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

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

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

Вопросы:

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

Ответы [ 4 ]

28 голосов
/ 25 октября 2011

Вот множество ответов:

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

  2. Размер Как уже упоминал Дирк, форматы файлов можно описать как независимые от приложения и зависящие от приложения. Другая ось - это независимое от домена (или не учитывающее домен) или зависящее от домена (domain-smart ;-)) хранилище. Если у вас есть некоторые знания о том, как будут возникать ваши данные, особенно любая информация, которая может быть использована для сжатия, вы сможете создать лучший формат, чем все, что могут делать стандартные компрессоры. Это займет немного работы. Альтернативные компрессоры, кроме 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 , мы настоятельно рекомендуем взглянуть на другие возможные форматы хранения, особенно для больших, растущих наборов данных.Если вам приходится делиться данными с другими или, по крайней мере, предоставлять доступ для чтения или записи, тогда настоятельно рекомендуется использовать другие форматы.Нет смысла тратить время на обслуживание читателей / писателей для других языков - это просто data , а не код.:) Сфокусируйте свой код на том, как разумным образом манипулировать данными, а не тратить время на работу с хранилищем - другие люди уже очень хорошо поработали над этим.

9 голосов
/ 20 октября 2011

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

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

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

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

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

5 голосов
/ 20 октября 2011

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

  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))
}
4 голосов
/ 25 октября 2011

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

Все платформы R используют XDR (бигендовское) представление C ints и удваивается в двоичных файлах save-d, и они переносимы на все платформы R.

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

Также обратите внимание, что netCDF 4 все еще проблематичен в R.

...