2013-02-08 3 views
2

В моем приложении Ruby On Rails я должен хранить (относительные) большие матрицы размером около 300x300 элементов (значения поплавка, в основном разные) на один документ. При каждом получении документа полная матрица должна быть загружена для пользовательских вычислений. Матрицы также обновляются довольно часто (так что проблема записи и кэширование памяти тоже проблема).Хранить большую матрицу в приложении Rails

Что такое хороший способ хранения таких матриц (исполнение разумно)? Некоторые варианты, которые приходят на ум:

  1. таблица со столбцами row, column и value. Но я предполагаю, что выборка и хранение целой матрицы (около 90000 ячеек) - это не очень хорошая идея для каждого запроса (поможет некоторое кэширование памяти).
  2. Сохраните матрицу, сериализованную в текстовое поле/столбец. Есть ли у вас какие-либо идеи, как он сравнивается с 1. с точки зрения производительности?
  3. Используйте некоторую базу данных документов (например, Mongo) и сохраните всю матрицу внутри одного поля документа (не уверен, где преимущество по сравнению с 2. is).
+0

как насчет подключения с R или Matlab и др для матрицы работы и пусть они делают тяжелый груз? – fuzzyalej

+0

отвечает на несколько схожий вопрос, даже если это не редкие данные, поэтому не все будут релевантными: http://stackoverflow.com/a/2599384/178651 - трюк, который, как мне кажется, должен сначала подумать о способе хранения/извлекать его эффективно в/из БД, тогда вы можете определить, сколько парсинга, сравнения и т. д. вам нужно сделать в Rails. –

+1

Учитывая, что это уникальный сценарий для ваших нужд, я предлагаю вам попробовать несколько вариантов, которые выглядят лучше всего. Моя первая мысль состояла в том, чтобы просто сохранить его как большой blob (думаю, CSV) (вариант № 2). Но мне никогда не нужно было хранить что-либо вроде ваших требований, поэтому было бы трудно предсказать. Я бы не использовал MongoDB только для этого. Ваше описание не похоже на то, что вам понадобятся другие функции БД. – WiredPrairie

ответ

0

Проблема с записью и извлечением по требованию из любого хранилища, совместимого с ACID, будет проблемой. Как наилучшая практика, я бы предложил стратегию с кэшем, которая хранит вашу матрицу в памяти, возможно, используя memcache, если вам это нужно на нескольких серверах. Затем вы можете читать и писать из цикла запросов, а затем вам не нужно заботиться о производительности записи и использовать что угодно (например, текстовое поле в MySQL или что-то еще).

Чтобы сделать это, я предлагаю писать пользовательский класс матрицы, который делает следующее:

  • проверяет кэш для копии это данные, если нет в наличии, грузы из базы данных и заполнит кэш ,
  • Записывает базу данных асинхронно, когда ваша копия кэша обновляется.
  • Обеспечивает оптимизированные интерфейсы к данным для кода
Смежные вопросы