Загрузка большого объема данных в память - наиболее эффективный способ сделать это?

У меня есть веб-система поиска / просмотра документации, которую я разрабатываю для клиента. Частью этой системы является поисковая система, которая позволяет клиенту искать термины, содержащиеся в документации. У меня созданы необходимые файлы данных поиска, но нужно загрузить много данных, и загрузка всех данных занимает от 8 до 20 секунд. Данные разбиты на 40-100 файлов, в зависимости от того, в какой документации нужно искать. Каждый файл имеет размер от 40 до 350 КБ.

Кроме того, это приложение должно иметь возможность работать в локальной файловой системе, а также через веб-сервер.

Когда веб-страница загружается, я могу сгенерировать список файлов с данными поиска, которые мне нужно загрузить. Чтобы веб-страницу можно было считать работоспособной, необходимо загрузить весь этот список.

С этим предисловием, давайте посмотрим, как я это делаю сейчас.

После того, как я узнаю, что загружена вся веб-страница, я вызываю функцию loadData ()

function loadData(){
            var d = new Date();
            var curr_min = d.getMinutes();
            var curr_sec = d.getSeconds();
         var curr_mil = d.getMilliseconds();
         console.log("test.js started background loading, time is: " + curr_min + ":" + curr_sec+ ":" + curr_mil);
          recursiveCall();
      }


   function recursiveCall(){
      if(file_array.length > 0){
         var string = file_array.pop();
         setTimeout(function(){$.getScript(string,recursiveCall);},1);
    }
    else{
        var d = new Date();
        var curr_min = d.getMinutes();
        var curr_sec = d.getSeconds();
        var curr_mil = d.getMilliseconds();
        console.log("test.js stopped background loading, time is: " + curr_min + ":" + curr_sec+ ":" + curr_mil);
    }
  }

Она последовательно обрабатывает массив файлов с перерывом в 1 мс между файлами.Это помогает предотвратить полную блокировку браузера во время процесса загрузки, но браузер по-прежнему имеет тенденцию зависать при загрузке данных. Каждый из загружаемых мной файлов выглядит так:

AddToBookData(0,[0,1,2,3,4,5,6,7,8]);
AddToBookData(1,[0,1,2,3,4,5,6,7,8]);
AddToBookData(2,[0,1,2,3,4,5,6,7,8]);

Где каждая строка - это вызов функции, добавляющей данные в массив. Функция «AddToBookData» просто выполняет следующие действия:

    function AddToBookData(index1,value1){
         BookData[BookIndex].push([index1,value1]);
    }

Это существующая система. После загрузки всех данных «AddToBookData» может вызываться более 100 000 раз.

Я решил, что это было довольно неэффективно, поэтому я написал сценарий, чтобы взять файл test.js, который содержит все вызовы функций выше, и обработал его, чтобы преобразовать его в гигантский массив, который равен структуре данных, которой является BookData. создание. Вместо того, чтобы выполнять все вызовы функций, как это делала старая система, я просто делаю следующее:

var test_array[..........(data structure I need).......]
BookData[BookIndex] = test_array;

Я ожидал увидеть повышение производительности, потому что я удалял все вызовы функций выше, этому методу требуется немного больше времени, чтобы создать точный структура данных. Я должен отметить, что в моем реальном тесте test_array содержит чуть более 90 000 элементов.

Похоже, что оба метода загрузки данных имеют примерно одинаковую загрузку ЦП. Я был удивлен, обнаружив это, так как ожидал, что второй метод потребует мало времени ЦП, поскольку структура данных создается заранее.

Сообщите, пожалуйста?

20
задан user210099 12 November 2010 в 15:50
поделиться