Javascript 我可以将文件存储在";“记忆”;使用Node.js?
我正在使用node.js进行一些文件处理工作,我使用的许多包都需要发送一个“路径”,以便它们可以打开文件、执行一些工作,等等 但我正在解析数以百万计的文件,并不是将它们实际存储在磁盘上,而是将它们存储在内存中。这些文件的内容都在我的数据库中,我不想把它们写到磁盘上,只是为了对它们进行我那疯狂的令人敬畏的工作Javascript 我可以将文件存储在";“记忆”;使用Node.js?,javascript,node.js,file-io,Javascript,Node.js,File Io,我正在使用node.js进行一些文件处理工作,我使用的许多包都需要发送一个“路径”,以便它们可以打开文件、执行一些工作,等等 但我正在解析数以百万计的文件,并不是将它们实际存储在磁盘上,而是将它们存储在内存中。这些文件的内容都在我的数据库中,我不想把它们写到磁盘上,只是为了对它们进行我那疯狂的令人敬畏的工作 那么这样的事情有可能吗?看这篇文章似乎有可能做到这一点因为我还没有找到一个适合我需要的库,我已经创建了。它是一个小型库,试图有效地存储数据,如缓冲区和字符串,并使其可流化。我在自己的项目中使
那么这样的事情有可能吗?看这篇文章似乎有可能做到这一点因为我还没有找到一个适合我需要的库,我已经创建了。它是一个小型库,试图有效地存储数据,如缓冲区和字符串,并使其可流化。我在自己的项目中使用它,到目前为止,它就像一个魅力
如果您发现了一个bug,或者还有什么可以添加的,请告诉我。您可以使用,这是Node.js的内存文件系统。在从数据库中获取每个文件后,然后使用
myBuffer.toString()可以使用let myBuffer=Buffer.from(fetchedData)
创建一个缓冲区
若要将文件更改为字符串并按您喜欢的方式对其进行解析/操作如果您使用的是Linux系统,则只需通过以下nodejs代码创建您自己的tmpfs(RAM)。这将根据节点代码在/mnt/myramdisk处创建一个tmpfs。必须事先通过mkdir/mnt/myramdisk手动创建目录/mnt/myramdisk
var MountPoint='/mnt/myramdisk';
var TextFile='/MyTextFileInRAM.txt';
var RAM_Size='512m';
const fs = require('fs');
const { exec } = require('child_process');
exec("awk '{print $2}' /proc/mounts | grep "+MountPoint, (err, stdout, stderr) => {
if (err) {
// node couldn't execute the command
//console.log(err);
console.log(MountPoint+' is Not Mounted yet. Im mounting it now:\n');
NotMountedYetSoMountIt();
return;
}
// the *entire* stdout and stderr (buffered)
if(stdout)
{
console.log(MountPoint+' is Already Mounted');
TextToWriteToFileOnTMPFS();
}
});
function NotMountedYetSoMountIt()
{
const { exec } = require('child_process');
exec('df -h && echo && mount -t tmpfs -o size='+RAM_Size+' tmpfs '+MountPoint+' && echo && df -h', (err, stdout, stderr) => {
if (err) {
// node couldn't execute the command
return;
}
// the *entire* stdout and stderr (buffered)
console.log(`stdout: ${stdout}`);
TextToWriteToFileOnTMPFS();
console.log(`stderr: ${stderr}`);
});
}
function TextToWriteToFileOnTMPFS()
{
let TextToWrite = 'Hello\n' +
'world @'+CurrentTime();
fs.writeFile(MountPoint+TextFile, TextToWrite, (err) => {
// throws an error, you could also catch it here
if (err) throw err;
// success case, the file was saved
console.log('saved!');
});
}
function addZero(i) {
if (i < 10) {
i = "0" + i;
}
return i;
}
function CurrentTime()
{
var d = new Date();
var h = addZero(d.getHours());
var m = addZero(d.getMinutes());
var s = addZero(d.getSeconds());
return h + ":" + m + ":" + s;
}
您可以在启动时将文件复制到/dev/shm(或/tmp,如果是它的tmpfs)中,然后将最终结果持久化这听起来像是缓存,快速搜索让我找到了这个。除了@guido的答案之外,还要将其写入tmp指令。使用需要“路径”的包的问题在于它们是使用I/O库实现的。因此,要使用内存解决方案,您还必须避免使用这些库。我不知道文件的大小,但可以肯定的是,您将无法将所有数据完全存储在内存(RAM)中。如果涉及fs
模块,这可能是由于路径的要求,然后,它们需要是可访问文件系统中的文件。您应该能够使用虚拟磁盘或内存中的fs,例如。但是,除非数据库本身可以假装成文件系统,否则您必须将它们写出来。或寻找可用于流或缓冲区而不是路径的替代方法或包。但是,我应该向需要文件路径的包传递什么?创建一个临时文件,然后删除。寻找更适合流的替代库。希望不会得到该答案@JoeI建议在答案中至少添加一段基本代码,而不是而不是将此作为链接。非常有趣,看起来与内置的“fs”一模一样
root@box:/daemons#node tmpfs_test.js && cat /mnt/myramdisk/MyTextFileInRAM.txt
/mnt/myramdisk is Not Mounted yet. Im mounting it now:
stdout: Filesystem Size Used Avail Use% Mounted on
udev 7.8G 0 7.8G 0% /dev
tmpfs 1.6G 1.4M 1.6G 1% /run
/dev/sda2 938G 436G 454G 49% /
tmpfs 7.8G 449M 7.4G 6% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup
/dev/loop1 90M 90M 0 100% /snap/core/8213
/dev/sda1 511M 6.1M 505M 2% /boot/efi
/dev/loop2 90M 90M 0 100% /snap/core/8268
Filesystem Size Used Avail Use% Mounted on
udev 7.8G 0 7.8G 0% /dev
tmpfs 1.6G 1.4M 1.6G 1% /run
/dev/sda2 938G 436G 454G 49% /
tmpfs 7.8G 449M 7.4G 6% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup
/dev/loop1 90M 90M 0 100% /snap/core/8213
/dev/sda1 511M 6.1M 505M 2% /boot/efi
/dev/loop2 90M 90M 0 100% /snap/core/8268
tmpfs 512M 0 512M 0% /mnt/myramdisk
stderr:
saved!
Hello
world @23:09:15
root@box:/daemons# node tmpfs_test.js && cat /mnt/myramdisk/MyTextFileInRAM.txt
/mnt/myramdisk is Already Mounted
saved!
Hello
world @23:09:19