2013-03-03 3 views
0

Я хочу обработать большой файл по строкам с помощью Node.js. Он имеет размер 100 МБ с 500 000 строк. Я нашел это решение для чтения строк в файле вводаСкопируйте строку за строкой из одного большого файла в другой?

javascript - node.js: read a text file into an array. (Each line an item in the array.) - Stack Overflow

Теперь речь идет о написании каждой строки в новый файл вывода, поэтому я стараюсь

function readLines(input, func) 
{ 
    var remaining = ""; 

    input.on("data", function(data) 
    { 
     remaining += data; 
     var index = remaining.indexOf("\n"); 
     var last = 0; 
     while (index > -1) 
     { 
      var line = remaining.substring(last, index); 
      last = index + 1; 
      func(line); 
      index = remaining.indexOf("\n", last); 
     } 

     remaining = remaining.substring(last); 
    }); 

    input.on("end", function() 
    { 
     if (remaining.length > 0) 
     { 
      func(remaining); 
     } 
    }); 
} 

function write(data) 
{ 
    var written = output.write(data); 
} 

var fs = require("fs"); 
var input = fs.createReadStream("input.txt"); 
var output = fs.createWriteStream("output.txt", {flags: "w"}); 
readLines(input, write); 

Однако сценарий очень медленно, он принимает более 1 часа, чтобы полностью обрабатывать входной файл и дорого стоит процессор и оперативная память (объем процессора равен 25, а объем использования памяти - до 200 МБ). Так может кто-нибудь сказать мне, есть ли способ его оптимизировать?

+0

Вы проверили некоторые другие ответы здесь? Например http://stackoverflow.com/questions/9486683/writing-large-files-with-node-js?rq=1 – mplungjan

ответ

1

Проблема, с которой вы сталкиваетесь, заключается в том, что вы постоянно 1) добавляете строку и 2) нарезаете строку. Обе эти операции, вероятно, вызывают выделение новых строк, а старые данные должны быть скопированы, это медленно. Старые строки больше не ссылаются, поэтому в конечном итоге они освобождаются сборкой мусора, но для этого требуется время, следовательно, большое использование памяти.

Простые способы сделать это, конечно, но я предполагаю, что вы хотите узнать, как это сделать, используя потоки в Node.JS. Общая техника, которую вы можете использовать для замены множества добавок и фрагментов в такой ситуации, - это накопление ваших данных в массиве строк. Вы можете присоединиться к массиву строк в один массив позже с mystring.join(""), который преобразует ["hello, ", "world"] в "hello, world". Гораздо быстрее создать массив строк, а затем объединить их сразу в большую строку, чем создавать строку, добавляющую каждую строку до последней.

Надеюсь, что это поможет, и вам достаточно решить эту проблему и по-прежнему чему-то научиться!

Смежные вопросы