Frage

Ich mache eine App, die sich mit Songs befasst, die zur App gezogen werden. Wenn ich das benutze file.size Um die Größe der Datei zu erhalten, dauert es ca. 1500 ms (AVG), um diesen Wert zu erhalten. Gibt es einen schnelleren Weg? Ich verstehe, warum es Zeit (und Speicher) braucht, aber da ich neu im Umgang mit Dateien in HTML5 bin, gibt es vielleicht etwas, von dem ich nicht weiß, was den Prozess schneller machen kann.

Gleiches gilt für die Dateisystem -API. Wenn ich die Datei durch sie rufe und anrufe file.size, Es braucht ähnliche Zeit.

PS Ich habe zu diesem Schluss gekommen, indem ich hinzugefügt wurde console.time() in meinem Code.

Hier ist der Code (massiv abgestreift)

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

Dies ist das Beispiel für Dateisystem -API. Dies (offensichtlich) braucht die benannte Datei id dort zu sein, damit es funktioniert. Nachfolgend finden Sie den D & D -Dateieingabegeradcode

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)
    }
}

BEARBEITEN

Ich bin auf einem AMD -Äquiv von Core Two Duo, 2,7 GHz, 2 Gigs Ram, Win7 x64. Die Spezifikationen, von denen ich glaube, dass sie tatsächlich anständig genug sind. Wenn also etwas auf meiner Maschine lange genug dauert, werde ich es als No-Go nehmen.

Dies ist ein Blocker für eine große Fehlerbehebung in meiner App. Ich möchte das wirklich gerne mit einem Fix für diese lange Zeit versenden. Ich kann (noch) kein Kopfgeld einstellen. Vielleicht gibt es eine Mindestzeit, bis eine Prämie festgelegt ist.

BEARBEITEN

Ich habe einige Tests durchgeführt und wie sich herausstellt, dauert es so lange, weil Chrome berechnet die Größe, anstatt es nur von Metadaten zu lesen. Hier ist das Testergebnis.

Je größer die Datei ist, desto länger dauert sie und wenn sie zum zweiten Mal aufgerufen werden, verwendet sie einen Cache und lädt die Datei nicht. Also jetzt .. wie kann ich diese Zeit reduzieren? Die Größe ist eine wichtige Informationen in meiner App, aber wahrscheinlich nicht wichtig genug, um die Upload -Rate des Benutzers für jede Datei um etwa 1,5 Sekunden zu verlangsamen! Ich plane, Bibliotheken zu importieren, und es würde wirklich dazu beitragen, diese Zeit beim Hinzufügen von rund 100 Songs zu reduzieren. Diesmal wird die Reaktionszeit der App eine große Beule sein.

War es hilfreich?

Lösung

Hier ist eine quasi ausgebildete Vermutung:

Anschauen Die Definition des HTML5 File Schnittstelle zeigt, dass a File ist ein Blob und das das size Attribut ist tatsächlich Teil der Blob Schnittstelle.

Seit einem Blob ist eine Abstraktion über einen rohen Datenbeteil size Attribut kann tatsächlich dazu führen, dass die Implementierung die gesamte Datei in den Speicher lädt. Sie können ein Experiment schreiben, um festzustellen, ob die Verzögerung mit der Größe der Datei variiert oder ob die Verzögerung nur beim ersten Lesen des size Attribut.

BEARBEITEN:

Ich habe wirklich das Gefühl, dass diese Ineffizienz ein Problem mit der Implementierung des Browsers des Browsers ist File Schnittstelle, aber hier sind zwei Workaround -Ideen, wie man Latenz beim Laden großer Dateien in den Speicher vermeidet:

Webarbeiter(MDN -Referenz, Whatwg webapps Standard) Würde Sie das langsame Laden der Dateien im Wesentlichen in einen anderen Thread einfügen. Ich denke, das ist Ihre beste Wahl.

Ein anderer Ansatz wäre, die zu verwenden slice Methode des Blob Schnittstelle zum Laden kleiner Teile der File. Wenn die Umsetzung von slice Lädt nur den erforderlichen Teil der Datei, sie sollte schneller werden. Sie müssen mehrere Scheiben für jede Datei laden, und Sie müssen erkennen, wenn Sie am Ende einer Datei gelangen, indem Sie auf die Größe des Blob zurückgekehrt von slice. Sie werden das Ende der Datei erkennen, indem Sie einen kleineren Blob zurückholen als erwartet- aus der Spezifikation:

Die Slice -Methode muss die Größe der Größe festlegen, wenn die Indexarithmetik die Grenzen der Größe überschreitet. Insbesondere bedeutet dies, dass für einen bestimmten Slice -Anruf:

Wenn Start + Länge> Größe> Benutzeragent ein BLOB-Objekt zurückgeben, als ob Slice (Start, Größestart) aufgerufen wurde.

Wenn Start> Größe> dann muss ein Benutzeragenten ein Blob -Objekt der Größe 0 zurückgeben

Leider erwähnt die Spezifikation auch die Möglichkeit, Ausnahmen zu veröffentlichen, wenn Sie ein Stück außerhalb von a anfordern BlobPuffergröße- Bei allen Implementierungen, die dies tun, müssen Sie eine Ausnahme einhalten, um das Dateiende zu erkennen.

Andere Tipps

Wenn Sie den Zeitpunkt der Konsole erhöhen.Time (), werden Sie mehr Leistung erzielen. Sie müssen sicherstellen, dass dieses Mal nicht das Timing ist, bis die Datei geladen und angezeigt wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top