在Node中存储大JSON数组

j2qf4p5b  于 2023-10-17  发布在  Node.js
关注(0)|答案(1)|浏览(114)

我尝试在文件中存储JSON对象数组。
问题是,如果数组太大,就会抛出错误:

Invalid String Length

在调用JSON.stringify(array)时会发生这种情况。
Node中的最大字符串长度为2 ** 29 - 24
一个好的方法是每个对象都应该有一个大小限制(比如每个对象10MB)
考虑到这一点,我如何计算一个文件可以有多少个对象?

g6baxovj

g6baxovj1#

很抱歉迟到了,我想给你一个答案。
所以Node中的最大字符串长度是~ 500 mb。
我使用的算法是:

const maxFileSize = 524288000; // 500 mb

const maxDocumentSize = 1048576; // 1 mb

const maxDocumentSizeWithSpace = maxDocumentSize + 1000; // make room for [] and commas

const maxDocuments = Math.floor(maxFileSize / maxDocumentSizeWithSpace);

现在知道了每个文件可以存储多少文档,我们可以继续。
maxDocumentSizeWithSpace很重要,因为文件中存储的JSON字符串是一个文档数组,因此会出现字符,[]
现在我们永远不会得到Invalid String Length,因为我们可以在写入文件之前检查文档是否符合预期的大小:

const file = "./file.json";

const documents = [
  {id: 1, name: "hello"},
  {id: 2, name: "world"},
];

for (const document of documents) {
  const encoder = new TextEncoder();

  const encoded = encoder.encode(JSON.stringify(document));

  if (encoded.length > maxDocumentSize) {
    throw new Error(`Max document size is ${maxDocumentSize} bytes.`);
  }
}

await fsp.writeFile(file, JSON.stringify(documents));

相关问题