Domanda

sto facendo un app che si occupa di canzoni trascinati al app. Quando uso il file.size per ottenere la dimensione del file che ci vuole circa 1500ms (media) per ottenere questo valore. C'è un modo più veloce? Capisco perché ci vuole tempo (e memoria) ma visto che sono nuovo a che fare con i file in HTML5, forse c'è qualcosa che non so di che può rendere il processo più veloce.

Lo stesso si vale per l'API del file system. Se chiamo nel file attraverso di essa e richiesta di file.size, ci vuole tempo simile.

PS Ho avuto modo di questa conclusione con l'aggiunta di console.time() nel mio codice.

Ecco il codice (massicciamente ridotta)

fileSystem.root.getFile(id, {}, function(fileEntry) {
    fileEntry.file(function(audioTemp) {
        console.time(1);
        console.log(audioTemp.size);
        console.timeEnd(1)
    });
});

Questo è l'esempio di file system API. Questo (ovviamente) ha bisogno del id file chiamato ad essere lì per farlo funzionare. Di seguito è riportato il codice di ingresso file di D & D

function onChangeAddSongsInput() {
    var files = document.getElementById('addSongsInput').files;
    for(var i=0; i<files.length; i++) {
        console.time(1);
        console.log(files[i].size);
        console.timeEnd(1)
    }
}

Modifica

Sono su un equiv AMD del nucleo due duo, 2.7 GHz, 2 GB di ram, win7 x64. Le specifiche Credo che sono in realtà abbastanza decente. Quindi, se qualcosa ci vuole abbastanza a lungo sulla mia macchina mi prenderò come un no-go.

Questo è un bloccante per un importante fix bug nella mia app. Mi piacerebbe davvero spedire il con una correzione per questo lungo periodo di tempo compreso. Non riesco a impostare una taglia (ancora) forse c'è un tempo minimo prima di una taglia è impostato.

Modifica

Ho fatto qualche test e come si scopre, ci vuole tanto tempo perché Chrome calcola le dimensioni invece di leggerlo da alcuni metadati. Qui è il risultato del test.

Il più grande è il file, il tempo che impiega e se chiamato seconda volta che utilizza alcuni cache e non carica il file. Così ora .. come posso ridurre questo tempo? La dimensione è un info importante nella mia app, ma probabilmente non abbastanza importante da velocità di upload lento dell'utente di circa 1,5 secondi per ogni file! Sto pensando di importare librerie e sarebbe davvero contribuire a ridurre questo tempo in cui l'aggiunta di 100 o giù di lì canzoni. Questa volta poi sarà un grande urto per i tempi di risposta dell'applicazione.

È stato utile?

Soluzione

Ecco una supposizione quasi-istruiti:

la definizione del HTML5 File interfaccia mostra che una File è un Blob e che l'attributo size è in realtà parte della Blob interfaccia .

Poiché un Blob è un'astrazione su un pezzo grezzo di dati, accesso all'attributo size potrebbe effettivamente causare l'attuazione di caricare l'intero file nella memoria. Si potrebbe scrivere un esperimento per vedere se il ritardo varia con le dimensioni del file o se il ritardo si verifica solo sulla prima lettura dell'attributo size.

Modifica :

Mi sento come questa inefficienza è un problema con l'attuazione del browser dell'interfaccia File, ma here're due idee di soluzione su come evitare la latenza durante il caricamento di file di grandi dimensioni in memoria:

lavoratori web ( MDN riferimento , WHATWG Webapps standard ) permetterebbe di mettere il caricamento lento dei file in sostanza, in un altro thread. Questo, credo, è la soluzione migliore.

Un altro approccio sarebbe quello di utilizzare il metodo di href="http://www.w3.org/TR/2009/WD-FileAPI-20091117/#dfn-slice" rel="nofollow"> slice dell'interfaccia Blob per caricare piccole porzioni del File. Se la realizzazione di slice carica solo la parte necessaria del file, si dovrebbe andare più veloce. Dovrete caricare più sezioni per ogni file e avrete bisogno di rilevare quando si arriva alla fine di un file, prestando attenzione alle dimensioni del Blob restituito da slice. Potrai rilevare la fine del file da ottenere indietro un blob più piccolo di te expected-- dalla spec:

Il metodo slice DEVE morsetto su valori di grandezza se index aritmetica supera i limiti di dimensione. In particolare, questo significa che per una determinata chiamata fetta:

Se start + lunghezza> dimensioni poi un agente utente deve restituire un oggetto Blob come se slice (inizio, dimensioni-start) è stato chiamato.

Se start> dimensioni poi un agente utente deve restituire un oggetto Blob di dimensioni 0

Purtroppo, le specifiche menziona anche la possibilità di generare eccezioni quando si richiede un esterno fetta di size-- tampone di un Blob su eventuali implementazioni che lo fanno, dovrete catturare un'eccezione per rilevare la fine del file.

Altri suggerimenti

se si aumenta il tempo impostato sotto Console.Time (), che vi darà maggiori prestazioni. È necessario fare in modo che questa volta non è timeout fino al file sia caricato e visualizzato.

scroll top