为什么这些缓冲区段的字节计数器显示 8TB?

Why is the byte counter of these buffer segments showing 8TB?

我知道我正在做一个计算上不可行的事情,本质上是 但使用 1MB exe 的字节而不是字符串中的字符。

但我想看看所有段加起来有多少字节,至少在我的程序崩溃之前是这样。好吧它确实崩溃了,但我认为我的字节数是错误的。

const fs = require("fs");

const bytesPerKB = 1000;
const bytesPerMB = bytesPerKB * 1000;
const bytesPerGB = bytesPerMB * 1000;
function getAllSegments(buffer, skip = 1) {
  let i, j, result = [], bytes = 0;

  for (i = 0; i < buffer.length; i += skip) { 
      if (i % 1000 === 0) console.log('getting ranges for byte', i, 'with a total of', bytes / bytesPerGB, 'GB stored')
      for (j = i + 1; j < buffer.length + 1; j++) {  
          const entry = buffer.slice(i, j)
          bytes += entry.length
          result.push(entry);
      }
  }
  return result;
}

console.log('ready')

fs.promises.readFile('../data/scraped/test-1MB.exe').then(data => {
  console.log('read file', data)
  let segements = getAllSegments(data, 10000)
  console.log('segments', segements);
})

输出:

我很确定我的 PC 上没有 8 TB 的存储空间,更不用说分配的 8 TB 交换 space 了。我在字节计数数学上做错了什么?

对于缓冲区中的每个起始位置,您都会累积从该起始位置到缓冲区末尾的所有可能子字符串的长度。然后,您重复该处理,从一个字节开始进一步进入缓冲区。有数以百万计的重复项和大量重叠项,因此,当然,它们加起来远远超过文件大小或内存大小。

至于内存使用,buffer.slice(),returns 一个引用原始内存的新 Buffer 对象,这就是内存使用不会爆炸的原因,因为每个子缓冲区都不是数据的单独副本。它只是一个新的 Buffer 对象,它“指向”具有偏移量和长度的现有缓冲区。

来自 doc for buffer.slice():

Returns a new Buffer that references the same memory as the original, but offset and cropped by the start and end indices.