Ruby on Rails - Хранение и доступ к большим наборам данных - PullRequest
1 голос
/ 16 декабря 2010

Мне трудно управлять хранилищем и доступом к большому набору данных в приложении Ruby on Rails.Вот мое приложение в двух словах: я выполняю алгоритм Дейкстры в части, касающейся дорожной сети, а затем отображаю узлы, которые он посещает, с помощью API карт Google.Я использую открытый набор данных дорожной сети США для построения графика, повторяя два txt-файла, указанных в ссылке, но у меня возникают проблемы с хранением этих данных в моем приложении.

У меня сложилось впечатление, что большой набор данных, подобный этому, не является объектом ActiveRecord - мне не нужно изменять содержимое этих данных, а иметь возможность обращаться к ним и локально кэшировать их в хэше, чтобы выполнять над ними методы ruby.Я попробовал несколько вещей, но у меня возникли проблемы.

  1. Я подумал, что было бы наиболее разумно проанализировать текстовые файлы и сохранить график в формате yml.Затем я смог бы загрузить график в БД в качестве начальных данных и захватить график, используя Node.all или что-то в этом роде.К сожалению, файл yml становится слишком большим для рельсов для обработки.Запуск Rake заставляет систему работать на 100% бесконечности ...

  2. Далее я решил, что, поскольку мне не нужно изменять данные, я могу просто создать графиккаждый раз, когда приложение загружается как начало его «инициализации».Но я точно не знаю, куда поместить этот код, мне нужно запустить несколько методов или хотя бы блок данных.А затем сохраните его в некоторой глобальной переменной / переменной сессии, к которой я могу получить доступ во всех контроллерах / методах.Я не хочу передавать этот большой набор данных, просто иметь к нему доступ из любого места.

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

В идеале, я хотел бы сохранить график в базе данных, котораяЯ мог бы захватить все содержимое, чтобы использовать его локально.Или, по крайней мере, требуется только один раз проанализировать данные при загрузке приложения, и тогда я смогу получить доступ к ним из разных просмотров страниц и т. Д. Я чувствую, что это будет наиболее эффективным, но я сталкиваюсь с препятствиями намомент.

Есть идеи?

1 Ответ

0 голосов
/ 16 декабря 2010

Вы на правильном пути.Есть несколько способов сделать это.Одним из них является то, что в вашем классе модели вне любого метода установите константы, подобные этим примерам:

MY_MAP = Hash[ActiveRecord::Base.connection.select_all('SELECT thingone, thingtwo from table').map{|one| [one['thingone'], one['thingtwo']]}]
RAW_DATA = `cat the_file`  # However you read and parse your file
CA = State.find_by_name 'California'
NY = State.find_by_name 'New York'

Они будут выполнены один раз в производственном приложении: когда класс моделизагружен.Другой вариант: выполнить эту инициализацию в инициализаторе или другом конфигурационном файле.Смотрите каталог config / initializers.

...