Question

Je fait une application qui traite des chansons traînés à l'application. Lorsque j'utilise le file.size pour obtenir la taille du fichier, il faut environ 1500ms (moyenne) pour obtenir cette valeur. Y at-il moyen plus rapide? Je comprends pourquoi il prend du temps (et de la mémoire), mais depuis que je suis nouveau pour traiter les fichiers en HTML5, peut-être il y a quelque chose que je ne sais pas ce qui peut rendre le processus plus rapidement.

Le même est fidèle pour l'API du système de fichiers. Si je l'appelle dans le fichier par le biais et appel à file.size, il faut du temps similaire.

PS je suis arrivé à cette conclusion en ajoutant console.time() dans mon code.

Voici le code (massivement dépouillée)

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

Ceci est l'exemple de l'API du système de fichiers. Ce (évidemment) a besoin du fichier nommé id d'être là pour que cela fonctionne. Voici le code d'entrée de fichier de 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)
    }
}

EDIT

Je suis sur un equiv AMD de noyau deux duo, 2,7 GHz, 2 Go de RAM, Win7 x64. Les spécifications sont en fait je crois assez décent. Donc, si quelque chose ne prend assez longtemps sur ma machine, je vais le prendre comme un non-droit.

Ceci est un bloqueur pour une correction de bug majeur dans mon application. Je voudrais vraiment expédier l'un correctif pour ce long temps inclus. Je ne peut pas définir une prime (encore) peut-être il y a un temps minimum avant une prime est fixé.

EDIT

Je l'ai fait quelques tests et il se trouve, il prend tellement de temps parce que le chrome calcule la taille au lieu de lire simplement à partir des métadonnées. est le résultat du test.

Plus le fichier, plus il faut et si elle est appelée deuxième fois, il utilise une cache et ne charge pas le fichier. Alors maintenant .. Comment puis-je réduire ce temps? La taille est une information importante dans mon application, mais probablement pas assez important pour le taux de téléchargement de l'utilisateur lent d'environ 1,5 secondes pour chaque fichier! Je prévois sur les bibliothèques et l'importation, il pourrait vraiment aider à réduire ce temps lors de l'ajout quelque 100 chansons. Cette fois-ci sera alors une bosse importante au temps de réponse de l'application.

Était-ce utile?

La solution

Voici une estimation quasi éduquée:

la définition de l'interface HTML5 File montre qu'un File est un Blob et que l'attribut size est en fait une partie de la Blob Interface .

Depuis un Blob est une abstraction sur un morceau brut de données, l'accès à l'attribut size pourrait effectivement provoquer la mise en œuvre de charger le fichier en mémoire. Vous pouvez écrire une expérience pour voir si le retard varie selon la taille du fichier ou si le retard ne se produit que sur la première lecture de l'attribut size.

EDIT :

Je me sens vraiment cette inefficacité est un problème avec la mise en œuvre de l'interface File du navigateur, mais here're deux idées de contournement sur la façon d'éviter la latence lors du chargement de fichiers volumineux en mémoire:

Web workers ( de référence MDN, WHATWG webapps standard) vous permettra de mettre la lenteur de chargement des fichiers essentiellement dans un autre thread. Ceci, je pense, est votre meilleur pari.

Une autre approche serait d'utiliser le méthode slice de l'interface Blob pour charger de petites portions de la File. Si la mise en œuvre de slice charge que la partie nécessaire du dossier, il devrait aller plus vite. Vous devrez charger plusieurs tranches pour chaque fichier et vous devrez détecter quand vous arrivez à la fin d'un fichier en prêtant attention à la taille du Blob retourné par slice. Vous détectez la fin du fichier en récupérant un blob plus petit que vous expected-- de la spécification:

La méthode de tranche DOIT serrer sur des valeurs de taille si arithmétique d'index dépasse les limites de taille. En particulier, cela signifie que pour un appel tranche donnée:

Si le démarrage + longueur> taille puis un agent utilisateur DOIT retourner un objet blob comme si tranche (début, la taille de démarrage) a été appelée.

Si le démarrage> taille puis un agent utilisateur DOIT retourner un objet blob de la taille 0

Malheureusement, la spécification mentionne également la possibilité de lancer des exceptions lorsque vous demandez une tranche en dehors d'un tampon de Blob de size-- sur toutes les implémentations qui font cela, vous devez attraper une exception pour détecter la fin du fichier.

Autres conseils

si vous augmentez le jeu de temps sous Console.Time (), il vous donnera plus de performance. Vous devez vous assurer que cette fois ne hors délai jusqu'à ce que le fichier est en cours de chargement et affiché.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top