Ускорение поиска в большом массиве json (для текстового поля автозаполнения jQuery / Rails) - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть текстовое поле местоположения, подключенное к плагину jquery EasyAutocomplete :

enter image description here

Работает, но проблема в том, что набор данных большой - 100 000 записей или около того. Неприемлемо много времени требуется, чтобы соответствовать любым результатам.

У меня есть конечная точка json в моем приложении, которая загружает записи для автозаполнения. Код в контроллере Rails выглядит следующим образом:

def index
  @locations = Location.select(:id,:canonical_name)

  respond_to do |format|
    format.json { render json: @locations }
  end
end

До сих пор я пытался поместить индекс в столбец canonical_name и поместить Rails.cache.fetch вокруг загрузки записей, но ни одна из этих вещей не сильно помогла.

Что можно сделать для ускорения этой операции?

1 Ответ

0 голосов
/ 10 апреля 2020

Проблема здесь не в поиске большого массива JSON. Во-первых, вы не выполняете поиск в базе данных.

Сначала вы выбираете 100 000 строк в своей базе данных и используете его для инициализации 100 000 объектов модели. Это не только займет много времени, но и потребляет гигантский c кусок оперативной памяти.

Вы затем go проходите и сериализуете эту коллекцию из 100 000 строк в мега длинную строку JSON, которая съедает еще больше оперативной памяти.

Затем он отправляется через inte rnet бедному клиенту, который получает ответ монстра JSON и исчерпывает данные своего мобильного плана. Даже если вы внедрили некую разновидность стека magi c, которая феноменально быстро увеличивает затраты, если просто получить здесь данные ошеломляют.

Кэширование может немного ускорить работу на стороне сервера, но на начальном этапе оно ничего не изменит «холодный» кеш или объем данных, передаваемых по проводам, и объем оперативной памяти, который он будет использовать на клиенте.

Реализация поиска на стороне сервера, такого как в geonames или google, на самом деле довольно сложная задача, и вы можете хочу исследовать существующие варианты.

Действительно наивная реализация будет:

@locations = Location.where(
  "canonical_name like ?", "%#{params[:query]}%"
).select(:id, :canonical_name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...