如何将大量随机字节写入文件
How to write a large amount of random bytes to file
我需要生成一些不同大小的文件来测试应用程序,我认为最简单的方法是编写一个 Node 脚本来执行此操作。
我写了下面的代码,但是当文件大小超过我的内存时进程崩溃了。
const fs = require("fs");
const crypto = require('crypto');
const gb = 1024 * 1024 * 1024;
const data = crypto.randomBytes(gb * 5);
fs.writeFile('bytes.bin', data, (err) => {
if (err) throw err;
console.log('The file has been saved!');
});
除了你的内存问题之外,你还会遇到加密模块的问题,因为它可以生成的字节数是有限的。
您将需要使用 fs.createWriteStream 以块的形式生成和写入数据,而不是一次生成。
这里是 Node documentation on streams 中一些代码的修改版本,用于将随机字节块流式传输到文件:
const fs = require("fs");
const crypto = require('crypto');
const fileName = "random-bytes.bin";
const fileSizeInBytes = Number.parseInt(process.argv[2]) || 1000;
console.log(`Writing ${fileSizeInBytes} bytes`)
const writer = fs.createWriteStream(fileName)
writetoStream(fileSizeInBytes, () => console.log(`File created: ${fileName}`));
function writetoStream(bytesToWrite, callback) {
const step = 1000;
let i = bytesToWrite;
write();
function write() {
let ok = true;
do {
const chunkSize = i > step ? step : i;
const buffer = crypto.randomBytes(chunkSize);
i -= chunkSize;
if (i === 0) {
// Last time!
writer.write(buffer, callback);
} else {
// See if we should continue, or wait.
// Don't pass the callback, because we're not done yet.
ok = writer.write(buffer);
}
} while (i > 0 && ok);
if (i > 0) {
// Had to stop early!
// Write some more once it drains.
writer.once('drain', write);
}
}
}
还有一些在线工具可以让您 generate files of your required size 的设置更少。这些文件也会在您的系统上生成,因此不必通过网络下载。
我需要生成一些不同大小的文件来测试应用程序,我认为最简单的方法是编写一个 Node 脚本来执行此操作。
我写了下面的代码,但是当文件大小超过我的内存时进程崩溃了。
const fs = require("fs");
const crypto = require('crypto');
const gb = 1024 * 1024 * 1024;
const data = crypto.randomBytes(gb * 5);
fs.writeFile('bytes.bin', data, (err) => {
if (err) throw err;
console.log('The file has been saved!');
});
除了你的内存问题之外,你还会遇到加密模块的问题,因为它可以生成的字节数是有限的。
您将需要使用 fs.createWriteStream 以块的形式生成和写入数据,而不是一次生成。
这里是 Node documentation on streams 中一些代码的修改版本,用于将随机字节块流式传输到文件:
const fs = require("fs");
const crypto = require('crypto');
const fileName = "random-bytes.bin";
const fileSizeInBytes = Number.parseInt(process.argv[2]) || 1000;
console.log(`Writing ${fileSizeInBytes} bytes`)
const writer = fs.createWriteStream(fileName)
writetoStream(fileSizeInBytes, () => console.log(`File created: ${fileName}`));
function writetoStream(bytesToWrite, callback) {
const step = 1000;
let i = bytesToWrite;
write();
function write() {
let ok = true;
do {
const chunkSize = i > step ? step : i;
const buffer = crypto.randomBytes(chunkSize);
i -= chunkSize;
if (i === 0) {
// Last time!
writer.write(buffer, callback);
} else {
// See if we should continue, or wait.
// Don't pass the callback, because we're not done yet.
ok = writer.write(buffer);
}
} while (i > 0 && ok);
if (i > 0) {
// Had to stop early!
// Write some more once it drains.
writer.once('drain', write);
}
}
}
还有一些在线工具可以让您 generate files of your required size 的设置更少。这些文件也会在您的系统上生成,因此不必通过网络下载。