【问题标题】:Streaming from file, transformation and to postgres error从文件流式传输,转换和到 postgres 错误
【发布时间】:2016-01-20 14:43:13
【问题描述】:

我需要用 1.5 G 左右的 tsv 文件填充 PG。我计划使用流式传输和 pg-copy-stream,它适用于直接复制。然后我需要做一些转换并添加一个直通管道,但它失败了。我想这可能是一个缓冲区问题,一定有人这样做了。

来源tsvfile.txt有格式

V1\tV2\tV3\tV4\n
V2\tV2\tV3\tV4\n

代码是

var fs = require('fs'), pg = require('pg'), es = require('es'), pgs = require('pg-copy-stream');
var filename = 'tsvfile.txt';
var pgkey = 'somepgkey';
pg.connect(pgkey, function(err, client, done){
    var query = client.query(pgs.from('COPY table1 (C1, C2, C3, C4) FROM STDIN'));
    var fstream = fs.createReadStream(filename);
    fstream.pipe(es.split())
           .pipe(es.mapSync(function(line){
                var midline = line.split('\t').map(sometransform()).join('\t');
                return midline + '\n';
                //not sure \n is necessary here
            }).pipe(query)
             .on('end', done)
             .on('err', somethingelse)
})

我得到的错误是 error: extra data after last expected column,但如果我移除前两个管道,效果很好。

【问题讨论】:

  • 更新:如果我删除前 2 个管道,它工作正常。但是当我通过`query.on('data', callback)注册一个侦听器来查询(这是一个流)时,它又把整个过程搞砸了。 pg 将放弃通信并且不存储任何数据。它可能与 pg-copy-stream 模块有关。

标签: javascript postgresql event-stream


【解决方案1】:

我要尝试的第一件事是删除 + '\n' - 这可能会弄乱新行。如果那没有帮助。第一步是创建一个不会改变任何东西的 sometransform() 函数。如果这可以正常工作,那么您的问题出在 sometranform() 函数中(例如,您是否在函数中添加了 \t ?)

【讨论】:

  • 我删除了整个转换部分,只留下了 es.split() 但它仍然无法正常工作。删除转换和 es.split() 将解决问题。我怀疑在进行转换时我弄乱了流中的缓冲区,但不知道如何调查或/和修复它。
【解决方案2】:

line.split('\t').map(sometransform()).join('\t')

someTransform 真的返回一个函数吗?用于转换数据?

如果答案是“否”或“什么?”,试试这个:line.split('\t').map( sometransform ).join('\t')

【讨论】:

    猜你喜欢
    • 2013-11-28
    • 2021-04-02
    • 2017-05-03
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 2013-08-03
    相关资源
    最近更新 更多