我尝试在文件中存储JSON对象数组。问题是,如果数组太大,就会抛出错误:
Invalid String Length
在调用JSON.stringify(array)时会发生这种情况。Node中的最大字符串长度为2 ** 29 - 24一个好的方法是每个对象都应该有一个大小限制(比如每个对象10MB)考虑到这一点,我如何计算一个文件可以有多少个对象?
JSON.stringify(array)
2 ** 29 - 24
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,因为我们可以在写入文件之前检查文档是否符合预期的大小:
maxDocumentSizeWithSpace
,
[
]
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));
1条答案
按热度按时间g6baxovj1#
很抱歉迟到了,我想给你一个答案。
所以Node中的最大字符串长度是~ 500 mb。
我使用的算法是:
现在知道了每个文件可以存储多少文档,我们可以继续。
maxDocumentSizeWithSpace
很重要,因为文件中存储的JSON字符串是一个文档数组,因此会出现字符,
、[
和]
。现在我们永远不会得到
Invalid String Length
,因为我们可以在写入文件之前检查文档是否符合预期的大小: