Nodejs for循环 - 流内存不足
Nodejs for loop - stream runs out of memory
我正在生成要保存的 CSV 文件。
有点大,但是代码很简单。
我使用流来防止内存不足错误,但无论如何它都会发生。
有什么建议吗?
const fs = require('fs');
var noOfRows = 2000000000;
var stream = fs.createWriteStream('myFile.csv', {flags: 'a'});
for (var i=0;i<=noOfRows;i++){
var col = '';
col += i;
stream.write(col)
}
您的 .csv 文件中的数据太多,无法在流中保存。 Streams 基本上使用您计算机的物理内存,因此它最多只能存储可用的物理内存。例如如果您的计算机有 8GB 的 RAM,其中 6 GB 是免费的,那么流不能存储超过 6GB。您可以将其分解成多个块,稍后再将其合并回目的地。
.csv 文件没有硬性大小限制。任何情况下的限制都是文件系统/硬盘大小。
The maximum file size of any file on a filesystem is determined by the
filesystem itself - not by the file type or filename suffix.
防止出现内存错误check you file size limit as per your filesystem partition。
添加一个 drain
事件监听器。
const fs = require("fs");
var noOfRows = 2000000000;
var stream = fs.createWriteStream("myFile.csv", { flags: "a" });
var i = 0;
function write() {
var ok = true;
do {
var data = i + "";
if (i === noOfRows) {
// last time!
stream.write(data);
} else {
// see if we should continue, or wait
// don't pass the callback, because we're not done yet.
ok = stream.write(data);
}
i++;
} while (i<=noOfRows && ok);
if (i < noOfRows) {
// had to stop early!
// write some more once it drains
stream.once("drain", write);
}
}
write();
而且noOfRows
太大了,可能会导致你的.csv
文件大小超出磁盘大小
我正在生成要保存的 CSV 文件。 有点大,但是代码很简单。 我使用流来防止内存不足错误,但无论如何它都会发生。 有什么建议吗?
const fs = require('fs');
var noOfRows = 2000000000;
var stream = fs.createWriteStream('myFile.csv', {flags: 'a'});
for (var i=0;i<=noOfRows;i++){
var col = '';
col += i;
stream.write(col)
}
您的 .csv 文件中的数据太多,无法在流中保存。 Streams 基本上使用您计算机的物理内存,因此它最多只能存储可用的物理内存。例如如果您的计算机有 8GB 的 RAM,其中 6 GB 是免费的,那么流不能存储超过 6GB。您可以将其分解成多个块,稍后再将其合并回目的地。
.csv 文件没有硬性大小限制。任何情况下的限制都是文件系统/硬盘大小。
The maximum file size of any file on a filesystem is determined by the filesystem itself - not by the file type or filename suffix.
防止出现内存错误check you file size limit as per your filesystem partition。
添加一个 drain
事件监听器。
const fs = require("fs");
var noOfRows = 2000000000;
var stream = fs.createWriteStream("myFile.csv", { flags: "a" });
var i = 0;
function write() {
var ok = true;
do {
var data = i + "";
if (i === noOfRows) {
// last time!
stream.write(data);
} else {
// see if we should continue, or wait
// don't pass the callback, because we're not done yet.
ok = stream.write(data);
}
i++;
} while (i<=noOfRows && ok);
if (i < noOfRows) {
// had to stop early!
// write some more once it drains
stream.once("drain", write);
}
}
write();
而且noOfRows
太大了,可能会导致你的.csv
文件大小超出磁盘大小