Обработка большого массива (12K + rows) в JavaScript

Требования к проекту нечетны для этого, но я хочу получить некоторое представление...

У меня есть файл CSV, содержащий около 12 000 строк данных, приблизительно 12-15 столбцов. Я преобразовываю это в массив JSON и загружаю его через JSONP (должен работать на стороне клиента). Требуется много секунд, чтобы выполнить любой запрос в наборе данных, чтобы вернуть меньший, отфильтрованный набор данных. В настоящее время я использую JLINQ для фильтрации, но я по существу просто перебираю массив и возвращаю меньший набор, основанный на условиях.

Может ли webdb или indexeddb позволить мне делать эту фильтрацию значительно быстрее? Какие-нибудь учебники/статьи, которые вы знаете об этом, решают эту проблему?

Ответы

Ответ 1

http://square.github.com/crossfilter/ (больше не поддерживается, см. https://github.com/crossfilter/crossfilter для более новой вилки.)

Crossfilter - это библиотека JavaScript для изучения больших многомерных наборов данных в браузере. Crossfilter поддерживает чрезвычайно быстрое (<30 мс) взаимодействие с согласованными представлениями, даже с наборами данных, содержащих миллион или более записей...

Ответ 2

Это напоминает мне статью Джона Ресига о словарных поисках (настоящий словарь, а не конструкцию программирования).

http://ejohn.org/blog/dictionary-lookups-in-javascript/

Он запускается с реализацией на стороне сервера, а затем работает на стороне клиента. Он должен дать вам несколько идей о том, как улучшить то, что вы делаете прямо сейчас:

  • Кэширование
  • Локальное хранилище
  • Вопросы памяти

Ответ 3

Если вам требуется загрузить весь объект данных в память перед тем, как применить к нему какое-то преобразование, я оставил бы IndexedDB и WebSQL вне диапазона, поскольку они как правило повышают сложность, так и снижают производительность приложений.

Для такого типа фильтрации библиотека, подобная Crossfilter, будет иметь большое значение.

Где IndexedDB и WebSQL могут входить в игру с точки зрения фильтрации, когда вам не нужно загружать или не загружать весь набор данных в память. Эти базы данных лучше всего использовать для их способности индексировать строки (WebSQL) и атрибуты (IndexedDB).

В базах данных браузера вы можете передавать данные в базу данных по одной записи за раз, а затем курсор через нее, по одной записи за раз. Преимущество здесь для фильтрации заключается в том, что это означает, что вы можете оставить свои данные на "диске" (a .leveldb в базе данных Chrome и .sqlite для FF) и отфильтровать ненужные записи либо как шаг предварительного фильтра, либо фильтр сам по себе.