gpt4 book ai didi

node.js - 在 Node.js 中附加多个 gzip 文件(同步)

转载 作者:太空宇宙 更新时间:2023-11-03 23:08:45 27 4
gpt4 key购买 nike

我正在编写一个脚本,该脚本读取大型日志文件,聚合它们,将聚合数据存储到 mongo 中,并将详细数据存储到大量的小 gzip 文件中。

我已经在 Perl 中实现了工作,我想在 Node.js 中执行此操作(抱歉,无法透露 Perl 版本)。

虽然我已经能够实现解析、聚合和存储到 mongo 中,但我对“存储大量小 gzip 文件”部分感到有点困惑。

导入过程:

  1. logReader 实例异步读取/解析单个日志文件,并时不时发出 data 事件(暂停读取流并等待恢复调用),end 当达到 EOF
  2. import 实例监听 logReader 发出的 data 事件(现在我需要以同步方式将详细数据放入小 gzip 文件中,然后恢复 logReader)
  3. end 上,剩余内容将按照步骤 2 进行存储。并且聚合文档将存储到 mongo 中(已使用批量操作和标准 mongo 驱动程序完成 mongo 存储)

将有多个 import 实例进程执行此工作,并且在尝试写入文件时可能会发生冲突(因此我需要通过 fs-ext 使用集群)。

假设导入实例位于 logReader data 事件回调中(第 2 步):

  • 我需要编写(创建或附加!)几千个 gzip 文件,并且每个文件:
    • 以附加模式打开具有精确位置的 gzip 文件
    • 使用独占锁锁定文件
    • 寻找它的结尾(也知道那里是否已经有任何数据 - 对于空文件,我想存储一个 header )
    • 创建 gzip 转换流,该流应该通过管道传输到打开的文件中(我不确定这在 Node.js 中是否能正常工作 - 在 Perl 中,我在执行此操作时指定了“Append”选项)
    • 将数据写入gzip流
    • 返回有关写入的行数和“for every file”循环所用时间的信息

下面的简化代码:

var fs = require('fs-ext'),
deasync = require('deasync'),
zlib = require('zlib');
IndexedFs.prototype.write = function(path, data) {
var io, pos, t = new Date();
io = fs.createWriteStream(path, {flags: 'a'});
while (io.fd === null) { deasync.runLoopOnce(); }
try {
fs.flockSync(io.fd, 'ex');
} catch (e) {
console.log("Failed to lock file '%s':\n %s", path, e);
io.end();
return false;
}
try {
pos = fs.seekSync(io.fd, 0, 2); // seek to end
} catch (e) {
console.log("Failed to seek end in file '%s':\n %s", path, e);
io.end();
return false;
}
io = zlib.createGzip().pipe(io);
if (pos === 0) { io.write(__HEADER.join("\t") + "\n"); }
count = _writeData(io, data); // this just serializes and does io.write(...)
io.end();
return [count, new Date() - t];
};

我需要上述函数是“同步的”(无论如何我想阻止整个过程)并返回有关写入的行数和所花费的时间的信息。

我找到了deasync这帮助我在调用 createWriteStream() 后等待文件实际打开。写入有效,但文件未压缩(所以我什至不知道附加是否有效)。

我明白了zlib in Node.js is async only - 因此,我希望获得有关如何实现我想要做的事情的提示/建议/最佳实践。

最佳答案

Node 0.12.0(可能更早)提供这些调用的同步版本:

http://nodejs.org/docs/v0.12.0/api/zlib.html#zlib_convenience_methods

// Compress w/ Zip
var zipData = zlib.gzipSync(json);

关于node.js - 在 Node.js 中附加多个 gzip 文件(同步),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25121382/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com