我有一个很大的(ASCII)文本文件,我想把它作为内存Map文件存储在Node.js中,我使用mmap-object
模块来实现这个目的,但是,我在创建一个新的mmap-object示例时,很难理解如何分配适当的内存。
文本文件是一个条目列表,每一个条目用换行符分隔,我想把每一行作为共享对象的一个属性存储,下面是使用mmap-object创建新共享对象的方法签名:
new Create(path, [file_size], [initial_bucket_count], [max_file_size]);
我知道文本文件中的行数,所以我将该值用于initial_bucket_count
参数,但是,我不确定file_size
参数使用什么值。
这就是我当前使用mmap-object
创建共享对象的方式:
const sharedObject = new Shared.Create(filePath, textFileSizeInKByte * 2, linesCount);
对于文本文件中的每一行,我尝试用两种方式存储行内容:
let lineIndex = 0;
for await (const line of rl) {
// Option 1: Store the line as an ASCII-encoded buffer
sharedObject[lineIndex] = Buffer.from(line, "ascii");
// Option 2: Store the line as a regular string
sharedObject[lineIndex] = line;
lineIndex++;
}
然而,在这两种情况下,内存Map文件最终都比原始文本文件大得多。我理解这会有一些开销,但是对于大约220 MB的文本文件,内存使用量可能高达文件大小的两倍,对于大约2.5GB的较大文本文件,内存使用量可能高达文件大小的五倍。
有人能帮助我理解为什么内存使用量比文件大小高得多,以及如何减少内存Map文件使用的内存量吗?
1条答案
按热度按时间xt0899hw1#
你能解释一下你的意思吗?内存Map非随机访问文件是非常不寻常的,所以也许你的意思是/从一个文本文件/读取/到/共享内存中的一个不同的数据结构/。
如果是这样,考虑一个具有精心选择的数据结构的段管理器:
这里,我们将使用libfmt实现转储:
我们将a textfile读为:
输出为:**第一个e第一个f第一个x
印刷