Фильтрация ~ 6mb объекта JSON в angujarjs, плохая идея?

0

Я делаю сканер штрих-кода. Единственными данными, которые у меня есть у клиента, является "файл" csv 6mb.

Я могу разобрать CSV в объект JSON, затем получить штрих-код и найти соответствующий элемент по объекту javascript в памяти 6mb. Это плохая идея? Насколько большой файл должен быть, в данном случае, влиять на производительность?

Что, если я превращу это в приложение с ионом? Было бы хуже?

Я знаю, что было бы лучше закодировать небольшой сервер api для запроса, но действительно ли это необходимо?

EDIT: файл загружается один раз с помощью угловой службы, сохраняя весь файл в переменной (пока приложение не будет закрыто). Фильтрация будет на этом объекте в памяти.

  • 0
    да, это плохая идея Это означает, что при каждом посещении будет загружено не менее 6 МБ, а размер JSON больше, чем у CSV. Вам следует использовать решение на стороне сервера (базу данных или анализ необработанного файла в формате CSV или JSON), которое может использоваться вашим клиентским приложением, например API.
  • 0
    Файл загружается один раз угловой службой, сохраняя весь файл в переменной (до тех пор, пока приложение не будет закрыто). Фильтрация будет на этом объекте в памяти.
Показать ещё 3 комментария
Теги:
csv
ionic-framework

2 ответа

1

Edit: Я сделал предположение, что код будет использоваться в SPA или что-то там, где он выполняется многократно, в отличие от того, что он запускается один раз на загрузку страницы или что-то в этом роде.

Браузер может справиться с проблемой 6mb без проблем - посмотрите на средний размер изображений в наши дни.

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

Например, объекты JavaScript, как правило, боятся, когда вы получаете слишком много ключей. Я уверен, что каждый браузер отличается, но я начал сталкиваться с проблемой около 11 000 или около того...

Поэтому я рекомендую разбивать штрих-коды на отдельные ведра - вот какой код, который помещает все 1 вместе и 2 с и т.д. Это действительно увеличивает производительность при работе с большими наборами данных.

var barcodes = {
  0: {},
  1: {},
  2: {},
  3: {},
  4: {},
  5: {},
  6: {},
  7: {},
  8: {},
  9: {}
};

function addBarcode(barcode, obj) {
  var firstNumber = barcode.charAt(0);
  barcodes[firstNumber][barcode] = obj;
}

function getBarcode(barcode) {
  var firstNumber = barcode.charAt(0);
  return barcodes[firstNumber][barcode];
}


addBarcode("1104", {
  testprop: true
});

var o = getBarcode("1104");
console.log("testProp should be true.  It is ", o.testprop);
  • 0
    Даже для SPA, если он используется многими людьми, он быстро закроет доступную полосу пропускания (множество одновременных подключений), в дополнение к необходимости высокой пропускной способности данных (большое количество посещений за период времени) без веской причины и каких-либо причин. реальная выгода.
  • 0
    @Emileb ОП не спрашивал о сетевых ударах. Мы могли бы больше узнать о его сценарии использования.
Показать ещё 5 комментариев
0

Во-первых, если это возможно, вы должны подготовить свои данные, прежде чем приносить их в свое приложение. Не читайте raw CSV в своем приложении. Создайте предварительно отредактированный файл.json и, возможно, другой.json для хранения предварительно проиндексированных данных.

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

Если вы хотите попытаться предварительно проиндексировать данные. Это может быть объект, который выглядит так, который нашел каждый 10-тысячный UPC и записал его значение для объекта.

var preIndex = [
    //{"limit" : at what index is, value: UPC value},
    {"limit" : 0 , value: 00000001234},
    {"limit" : 10000, value: 00009871234},
    {"limit" : 20000, value: 00019938234},
    ....
]

Затем ваш код должен будет найти, какие пределы окружают ваш UPC.

 //find value of X where 
 preIndex[x].value < YourUPC <= preIndex[x+1].value

 //now you only need to loop through 10 thousand items maximum
 //to find your item.
 for(var i = preIndex[x].limit; i <= preIndex[x+1].limit; i++){
     ... // if(myData[i].UPC == YourUPC)
 }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню