Carregando grande quantidade de dados na memória - a maneira mais eficiente de fazer isso?

Eu tenho um sistema de pesquisa / visualização de documentação baseado na Web que estou desenvolvendo para um cliente. Parte deste sistema é um sistema de pesquisa que permite ao cliente procurar por um termo [s] contido na documentação. Criei os arquivos de dados de pesquisa necessários, mas há muitos dados que precisam ser carregados e leva de 8 a 20 segundos para carregar todos os dados. Os dados são divididos em 40 a 100 arquivos, dependendo da documentação que precisa ser pesquisada. Cada arquivo está entre 40-350kb.

Além disso, esse aplicativo deve ser capaz de executar no sistema de arquivos local, bem como através de um servidor da web.

Quando a página é carregada, posso gerar uma lista de quais arquivos de dados de pesquisa eu preciso carregar. Toda a lista deve ser carregada antes que a página da web possa ser considerada funcional.

Com esse prefácio fora do caminho, vejamos como estou fazendo isso agora.

Depois de saber que toda a página da Web está carregada, chamo a função 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);
    }
  }

O que isso faz é processar uma matriz de arquivos sequencialmente, fazendo uma pausa de 1ms entre os arquivos. Isso ajuda a impedir que o navegador fique completamente bloqueado durante o processo de carregamento, mas o navegador ainda tende a ficar atolado ao carregar os dados. Cada um dos arquivos que estou carregando fica assim:

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]);

Onde cada linha é uma chamada de função que está adicionando dados a uma matriz. A função "AddToBookData" simplesmente faz o seguinte:

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

Este é o sistema existente. Depois de carregar todos os dados, "AddToBookData" pode ser chamado mais de 100.000 vezes.

Achei que isso era bastante ineficiente, então escrevi um script para pegar o arquivo test.js, que contém todas as chamadas de funções acima, e processei-o para transformá-lo em uma matriz gigante, igual à estrutura de dados que o BookData está criando. Em vez de fazer todas as chamadas de função que o sistema antigo fazia, basta fazer o seguinte:

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

Eu esperava ver um aumento no desempenho porque estava removendo todas as chamadas de função acima, esse método leva um pouco mais de tempo para criar a estrutura de dados exata. Devo observar que "test_array" contém pouco mais de 90.000 elementos no meu teste do mundo real.

Parece que ambos os métodos de carregamento de dados têm aproximadamente a mesma utilização da CPU. Fiquei surpreso ao descobrir isso, pois esperava que o segundo método exigisse pouco tempo de CPU, pois a estrutura de dados está sendo criada antes da mão.

Por favor informar?

questionAnswers(4)

yourAnswerToTheQuestion