节点读取指定块大小的文件

kjs*_*js3 7 upload node.js amazon-glacier

目标:将大文件上传到AWS Glacier,而不将整个文件保存在内存中.

我现在正在使用fs.readFileSync()上传到冰川,事情正在发挥作用.但是,我需要处理大于4GB的文件,我想并行上传多个块.这意味着转向分段上传.我可以选择块大小但是冰川需要每个块大小相同(除了最后一个)

这个帖子表明我可以在读取流上设置块大小,但实际上我并不能保证得到它.

有关如何在不将整个文件读入内存并手动拆分的情况下获取一致部件的任何信息?

假设我可以达到这一点,我只是使用集群,其中有几个进程可以像上传到AWS一样快速地关闭流.如果这似乎是错误的工作并行化的方式,我会喜欢那里的建议.

msc*_*dex 14

如果没有别的你可以使用fs.open(),fs.read()fs.close()手动.例:

var CHUNK_SIZE = 10 * 1024 * 1024, // 10MB
    buffer = Buffer.alloc(CHUNK_SIZE),
    filePath = '/tmp/foo';

fs.open(filePath, 'r', function(err, fd) {
  if (err) throw err;
  function readNextChunk() {
    fs.read(fd, buffer, 0, CHUNK_SIZE, null, function(err, nread) {
      if (err) throw err;

      if (nread === 0) {
        // done reading file, do any necessary finalization steps

        fs.close(fd, function(err) {
          if (err) throw err;
        });
        return;
      }

      var data;
      if (nread < CHUNK_SIZE)
        data = buffer.slice(0, nread);
      else
        data = buffer;

      // do something with `data`, then call `readNextChunk();`
    });
  }
  readNextChunk();
});
Run Code Online (Sandbox Code Playgroud)

  • @Poyoman这个解决方案是_保证_块大小的唯一方法,这正是OP所要求的。如果您不需要特定的块大小,那么是的,流式传输要容易得多。 (3认同)

小智 5

您可以考虑使用以下代码段,我们以 1024 字节的块读取文件

var fs = require('fs');

var data = '';

var readStream = fs.createReadStream('/tmp/foo.txt',{ highWaterMark: 1 * 1024, encoding: 'utf8' });

readStream.on('data', function(chunk) {
    data += chunk;
    console.log('chunk Data : ')
    console.log(chunk);// your processing chunk logic will go here

}).on('end', function() {
    console.log('###################');
    console.log(data); 
// here you see all data processed at end of file
    });
Run Code Online (Sandbox Code Playgroud)

请注意:highWaterMark 是用于块大小的参数希望这有帮助!

网络参考:https : //stackabuse.com/read-files-with-node-js/ 更改读取流块大小

  • 最后是节点流的一个很好的例子,它看起来不像太抽象的废话,也不会让我厌烦解释什么是二进制数。 (3认同)