У меня есть ASCII-файл объемом около 1 ГБ, моя задача здесь состоит в том, чтобы писать фиксированный текст каждые 1000 строк.
например,
Ожидаемый вывод
text line 1
text line 2
text line 3
...
text line 999
text line 1000
// My fixed text
text line 1001
text line 1002
Попытка 1 - кучи JavaScript не хватает памяти
Попытка записи по одному байту за раз и отслеживание количества новых строк.
Записывать мой фиксированный текст каждые 1000 строк
let src = `/path/to/src`;
let dst = `/path/to/dst`;
let readStream = fs.createReadStream(src);
let writeStream = fs.createWriteStream(dst);
let newline = 0;
readStream.on('data', chunk => {
for(let i in chunk) {
let c = chunk[i];
// write one byte at a time
writeStream.write(Buffer.from(chunk.buffer, i, 1))
if(c == 10) {
newline++;
// write fixed text for every 1000th line
if(newline && newline % 1000 == 0) {
writeStream.write("My Fixed Text");
}
}
}
}).on('end', () => {
console.log('done');
});
ФАТАЛЬНАЯ ОШИБКА: неэффективные компактные метки близки к пределу кучи. Выделение не удалось - кучи JavaScript не хватает памяти
Попытка 2 - Выходной файл зашифрован и не в порядке
То же, что попытка 1, но запись по одному байту за раз из моего предварительно выделенного буфера.
let src = `/path/to/src`;
let dst = `/path/to/dst`;
let readStream = fs.createReadStream(src);
let writeStream = fs.createWriteStream(dst);
let newline = 0;
let buffer = Buffer.alloc(1);
readStream.on('data', chunk => {
for(let i in chunk) {
let c = chunk[i];
buffer[0] = c;
// write one byte at a time from my pre-allocated buffer
writeStream.write(buffer)
if(c == 10) {
newline++;
// write fixed text for every 1000th line
if(newline && newline % 1000 == 0) {
writeStream.write("My Fixed Text");
}
}
}
}).on('end', () => {
console.log('done');
});
Нет ошибок, сценарию потребовалось некоторое время для завершения после печати done
Однако выходной файл выглядит полностью зашифрованным и вышедшим из строя
L,a'-etLL'7P62 ,,NL,n''he'L A,r'0et,L ,ei2'vrUb32oa0on' L,c27CirU 7' 2- tN Ng7Bha'0atLV7al'0e'pUbLe2,3 goLA0n'0,v',L9lc'1C,LI0Et0-m',UT5,nD1e''NU,On91arNE40r20ilHLVEn''''''''mwRL
(3(0-r''NUB o00at S7Eo'7'clUR32 20vowL 64v80vaL
0,u00hNNUE4n,1'aa L
2 AC1p,,NU e2'Cit,
22y F8etLL56Ola-1C'NLS3n '3mrUS34nn1-CL,g5tw7ma'L)'4t60h'L
Это задание звучит просто и понятно, но у меня возникают проблемы с этим.
Любая помощь приветствуется.