Я делаю сканер штрих-кода. Единственными данными, которые у меня есть у клиента, является "файл" csv 6mb.
Я могу разобрать CSV в объект JSON, затем получить штрих-код и найти соответствующий элемент по объекту javascript в памяти 6mb. Это плохая идея? Насколько большой файл должен быть, в данном случае, влиять на производительность?
Что, если я превращу это в приложение с ионом? Было бы хуже?
Я знаю, что было бы лучше закодировать небольшой сервер api для запроса, но действительно ли это необходимо?
EDIT: файл загружается один раз с помощью угловой службы, сохраняя весь файл в переменной (пока приложение не будет закрыто). Фильтрация будет на этом объекте в памяти.
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);
Во-первых, если это возможно, вы должны подготовить свои данные, прежде чем приносить их в свое приложение. Не читайте 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)
}