Обработка большого массива (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) и отфильтровать ненужные записи либо как шаг предварительного фильтра, либо фильтр сам по себе.