1

Я пытаюсь создать автозаполнение модели для городов и zipcode с использованием Rails 4 и JQuery ui. У меня есть большой файл JSON (около 500 000 строк), содержащий массив (cp_autocomplete), который содержит zipcode (CP) и города (CITY).Действия автозаполнения анализируют большой файл JSON при каждом вызове ajax (сделать это быстрее)

В моей текущей модели на каждый запрос ajax действие автозаполнения считывает JSON-файл, анализирует его, а затем ищет почтовый индекс или город, составляет список из девяти zipcode + городов (если найден) и отображает список как json ,

Это работает, но для отображения списка требуется более 2 секунд.

Любые идеи, чтобы заставить его работать быстрее? - Как я могу разобрать json-файл один раз, а не на каждый запрос ajax? - Я думал о кэшировании разобранного значения json и затем удалял его, например, через 1 минуту.

Вот мое автозаполнения действие:

def autocomplete 
     require 'auto_compeletion_cp_city' #a class that has PostalCode and City attributes 
    postal_file = File.read("#{Rails.root}/public/postal_code_fr.json") 
    postal_parse = JSON.parse(postal_file) 
    @list = [] 
    if !(ActionController::Base.helpers.sanitize(params[:Postalcode]).blank?) 
     search_term = ActionController::Base.helpers.sanitize(params[:Postalcode]) 
     search = /\A#{search_term}/ 
      postal_parse["cp_autocomplete"].each do |f| 
      if search.match("#{f['CP']}",0) && (@list.length < 9) 
       selected = AutoCompletionCpCity.new 
       selected.PostalCode = f['CP'] 
       selected.City = f['CITY'] 
       @list << selected 
      end 
      end 
    else 
     if !(ActionController::Base.helpers.sanitize(params[:city]).blank?) 
     search_term = ActionController::Base.helpers.sanitize(params[:city]) 
     search = /\A#{Regexp.escape(search_term)}/i 
     postal_parse["cp_autocomplete"].each do |f| 
      if search.match("#{f['CITY']}",0) && (@list.length < 9) 
       selected = AutoCompletionCpCity.new 
       selected.PostalCode = f['CP'] 
       selected.City = f['CITY'] 
       @list << selected 
      end 
     end 
     end 
    end 

    respond_to do |format| 
     format.json { 
     render json: @list 
     } 
    end 
    end 
+0

Как раз вы попробовали решение для базы данных? Или что-то вроде Redis для замены файла? Я часто использую это решение для поля выбора автозаполнения с помощью ajax и выбираю 2, но я никогда не пробовал что-то с 500 000 строк. –

+0

Я работаю над решением Redis .. Я дам вам знать, если это будет лучше. Для решения базы данных вы сохраните данные в виде json-массива или создаете новую базу данных sql? Я использую sqlite3 для разработки – Dali

+0

Предположительно, если у вас есть приложение rails, у вас уже есть база данных? Я бы сделал таблицу (или, может быть, пару таблиц) для хранения данных в этом текстовом файле. –

ответ

1

Создать небольшой модуль для размещения данных почтовых индексов. Он может анализировать файл один раз, когда процесс начинается и удерживается на нем навсегда. Поскольку почтовые коды не часто меняются (и этот файл находится в вашем репо, поэтому для его изменения требуется развертывание), нет причин для кэширования всего за 1 минуту.

module PostalCodes 
    DATA = JSON.parse(File.read("#{Rails.root}/public/postal_code_fr.json")) 
end 

Этот модуль также может отвечать за поиск кодов и других действий, которые вам нужны.

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

+0

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

+0

Да, конечно, вы могли бы поместить это в инициализатор. Для префиксных поисков [Tries] (https://en.wikipedia.org/wiki/Trie) - отличная структура. Получение этих данных в вашей БД также является хорошим вариантом. –

+0

При создании решения для кеша время ответа для запроса ajax выпадает до 200 мс с временем выполнения рельсов 66 мс. http://img15.hostingpics.net/pics/279561RailsView.png Стоит ли искать алгоритм Tries? – Dali

 Смежные вопросы

  • Нет связанных вопросов^_^