Golang:使用node.js中的可读流从PostgreSQL数据库中选择几百万行

Golang:使用node.js中的可读流从PostgreSQL数据库中选择几百万行,node.js,postgresql,go,Node.js,Postgresql,Go,我有一个约5000万行的PostgreSQL表,我想编写Go代码从该表中选择约100万行,并以高效的方式处理它们 上次我使用nodejs和这个NPM模块生成可读取的记录流,所以我可以像处理任何可读取的对象流一样处理它们 这里我发布了我用来处理数据的简化代码: 常数pg=需要('pg'); const QueryStream=require('pg-query-stream'); //将1000000行传输到标准输出,而不会占用大量内存 pg.connect((错误、客户端、完成)=>{ 如果(

我有一个约5000万行的PostgreSQL表,我想编写Go代码从该表中选择约100万行,并以高效的方式处理它们

上次我使用nodejs和这个NPM模块生成可读取的记录流,所以我可以像处理任何可读取的对象流一样处理它们

这里我发布了我用来处理数据的简化代码:


常数pg=需要('pg');
const QueryStream=require('pg-query-stream');
//将1000000行传输到标准输出,而不会占用大量内存
pg.connect((错误、客户端、完成)=>{
如果(错误)抛出错误;
const query=new QueryStream('SELECT*FROM generate_series(0,$1)num',[1000000]);
const stream=client.query(查询);
//流结束时释放客户端
流。在('end',done');
stream.on('data',函数(data){
stream.pause();
funcDoSomethingWithDataAsync(数据,函数(错误){
如果(错误)抛出错误;
stream.resume();
});
};
})
我如何在Go中模拟数据库记录的可读流?Go中是否与nodejs模块一样处理流式查询结果


我已经优化了查询,可以运行了,我只想流式处理查询执行结果,就像它在nodejs库中完成的一样。

是的,它的工作原理基本相同:执行查询,迭代结果。下面是一个简单的示例,它使用的是Postgres版本的

创建,然后遍历


我观察到使用lib/pq的Go程序的内存使用情况:

  • 当返回的结果集为0或1行时,使用的内存约为15MB
  • 当结果集有50K行(每行200字节,相当于10MB)时,我在循环结果时设置了睡眠,但内存增加只有2MB。 即使有多个如此繁重的请求,内存也增加了几MB

P> > Schwern是正确的,PQ保持了读取结果的缓冲区。我理解了代码> GITHUB.COM/LIB/PG是如何工作的,它将所有查询结果保存在RAM中,然后用<代码>行解析。下一个似乎消耗了大量RAM,而不是流式NoDEJS库。我很感激,但我不能把它看作是。还没有回答。没有,它有一个缓冲区来获取一些结果,以避免对每一行进行网络调用。使用不同大小的系列进行尝试,并检查内存使用情况,它应该保持不变。我将使用探查器尝试您的代码,并在此处提供结果,如果它工作正常,将为我节省大量精力this@vodolaz095保持循环睡眠,跑步它与10和10000000个数字进行比较,并比较内存大小。嘿@vodolaz095,你的结论是什么?
rows, err := db.Query(`SELECT * FROM generate_series(0, $1) num`, 1000000)
if err != nil {
   panic(err)
}
 
defer rows.Close()
for rows.Next() {
    var num int
 
    err = rows.Scan(&num)
    if err != nil {
       panic(err)
    }
 
    fmt.Println(num)
}