Filereader api sur les gros fichiers

Le code de votre lecteur de fichiers api a bien fonctionné jusqu'ici jusqu'à ce qu'un jour j'ai eu un fichier txt de 280 Mo de l'un de mes clients. Page se bloque juste en mode Chrome et Firefox ne se produit rien.

// create new reader object var fileReader = new FileReader(); // read the file as text fileReader.readAsText( $files[i] ); fileReader.onload = function(e) { // read all the information about the file // do sanity checks here etc... $timeout( function() { // var fileContent = e.target.result; // get the first line var firstLine = e.target.result.slice(0, e.target.result.indexOf("\n") ); }} 

Ce que j'essaie de faire ci-dessus, c'est que l'on obtient la première ligne de rupture afin que je puisse obtenir la longueur de la colonne du fichier. Ne devrais-je pas le lire en tant que texte? Comment puis-je obtenir la longueur de la colonne du fichier sans casser la page sur les gros fichiers?

    Votre application échoue pour les gros fichiers car vous lisez le fichier complet dans la mémoire avant de le traiter. Cette inefficacité peut être résolue en diffusant le fichier en continu (lecture de morceaux de petite taille), vous devez donc conserver une partie du fichier en mémoire.

    Un objet File est également une instance d'un Blob , qui offre la méthode .slice pour créer une vue plus petite du fichier.

    Voici un exemple qui suppose que l'entrée est ASCII (démo: http://jsfiddle.net/mw99v8d4/ ).

     function findColumnLength(file, callback) { // 1 KB at a time, because we expect that the column will probably small. var CHUNK_SIZE = 1024; var offset = 0; var fr = new FileReader(); fr.onload = function() { var view = new Uint8Array(fr.result); for (var i = 0; i < view.length; ++i) { if (view[i] === 10 || view[i] === 13) { // \n = 10 and \r = 13 // column length = offset + position of \r or \n callback(offset + i); return; } } // \r or \n not found, continue seeking. offset += CHUNK_SIZE; seek(); }; fr.onerror = function() { // Cannot read file... Do something, eg assume column size = 0. callback(0); }; seek(); function seek() { if (offset >= file.size) { // No \r or \n found. The column size is equal to the full // file size callback(file.size); return; } var slice = file.slice(offset, offset + CHUNK_SIZE); fr.readAsArrayBuffer(slice); } } 

    L'extrait précédent compte le nombre d'octets avant une rupture de ligne. Le nombre de caractères dans un texte composé de caractères multi-octets est légèrement plus difficile, car vous devez expliquer la possibilité que le dernier octet dans le morceau puisse faire partie d'un caractère multi-octets.