Node.js 节点js LZ4解码块以使用缓冲区解压缩循环

Node.js 节点js LZ4解码块以使用缓冲区解压缩循环,node.js,buffer,lz4,Node.js,Buffer,Lz4,现在我正在为解压一个文件而编码,请参阅中的LZ4.decodeBlock。但我需要读一个片段,然后用loop解压。我的代码如下。它很好用。但它使用了大量内存。每个片都有一个64K的新缓冲区 decipher.on('readable', ()=> { while (1) { var body = decipher.read(len); if (body) { var uncompressed = new Buffe

现在我正在为解压一个文件而编码,请参阅中的LZ4.decodeBlock。但我需要读一个片段,然后用loop解压。我的代码如下。它很好用。但它使用了大量内存。每个片都有一个64K的新缓冲区

decipher.on('readable', ()=> {
      while (1) {
          var body = decipher.read(len);
          if (body) {
            var uncompressed = new Buffer(64*1024);

            var uncompressedSize = lz4.decodeBlock(body, uncompressed);
            var uncompressed_end = uncompressed.slice(0, uncompressedSize);
            outStream.write(uncompressed_end);
          } else {
            break;
          }
        } else {
            break;
        }
       }
      });
  }
然后我想优化内存使用,我修改它如下。它将使用更少的内存。但它无法解压缩到与原始文件相同的内容

var uncompressed = new Buffer(64*1024);
   decipher.on('readable', ()=> {
      while (1) {
          var body = decipher.read(len);
          if (body) {
            var uncompressedSize = lz4.decodeBlock(body, uncompressed);
            var uncompressed_end = uncompressed.slice(0, uncompressedSize);
            outStream.write(uncompressed_end);
          } else {
            break;
          }
        } else {
            break;
        }
       }
      });
  }

那么,我应该如何利用缓冲区优化内存使用?

现在还不清楚您的期望是什么。您需要将数据加载到内存中才能使用它。你的
解压
缓冲区只有64k大小,你的
正文
缓冲区可能更小。
uncompressed.slice
函数不会增加内存开销。LZ4库确实支持纯流模式
input.pipe(编码器).pipe(输出)
,但它可能仍然使用内部缓冲。嗨,朱利安,谢谢你的回复。最大长度为64K,因此大小合适。现在我的问题是优化内存使用。由于我在循环中使用“newbuffer(64*1024)”,因此会占用大量内存。我只想使用一个“新缓冲区(64*1024)”来减少内存使用。但是我不知道如何正确地使用它?您的第二个代码示例比第一个代码示例更有效,但这主要是因为您在每次循环迭代中重用相同的缓冲区实例,因此发生的内存分配更少。但就内存使用而言,两者之间不一定有太大的实际区别。这是因为JavaScript中的内存是垃圾收集的,所以当第一个代码示例将继续从堆中获取内存时,它也将继续释放内存,因为前面的缓冲区被丢弃。您的第二个代码示例就要开始了,并且可能会尽可能提高代码的内存效率。我已经测试了global.gc(),它将使用更少的内存,但工作速度较慢。我想也许我可以在循环中一片一片地使用同步解压缩,然后我可以只重用一个缓冲区。和以前一样,在循环中,它异步解压缩,所以我不能重用一个缓冲区。你不应该自己直接调用GC,让JS虚拟机自动管理内存分配。如果您有严格的内存限制,并且希望对堆和GC行为有更多的控制,请从命令行查看v8 options节点支持: