【发布时间】:2017-10-23 19:23:49
【问题描述】:
原标题:如何减慢javascript中的PgSQL结果行流?
我在使用 RXJS(5.4.0) 和 PostgreSQL(驱动程序“pg”:“6.1.4”)的 nodejs v4.5.0 中遇到内存不足问题。
我手动创建一个可观察的 PgSQL 行,如下所示:
return Rx.Observable.create((subscriber) => {
pool.connect().then((client: pg.Client) => {
const stream:any = client.query(query.toParam());
stream.on('row', (row) => {
subscriber.next(row);
});
stream.on('end', () => {
subscriber.complete();
client.release();
});
});
});
然后我将一些运算符附加到 rx observable 并进行一些处理。 请注意,从数据库返回的行有点重。
调查使我得出一个结论: 从数据库中返回的行比处理它们要快得多。必须为大量数据保留内存才能等待处理,这会导致内存不足问题:
致命错误:CALL_AND_RETRY_LAST 分配失败 - 进程内存不足
中止陷阱:6
我在 PostgreSQL 驱动程序上没有看到任何暂停流的选项。有什么想法可以解决这个问题吗?
【问题讨论】:
-
您的原始查询是否获得了不必要的列?有时“select *”在大型结果集上是个坏主意。
-
不幸的是,在 SQL 查询级别没有太多优化空间。一列包含基本数据,这是最重要的一列。
-
您必须分页读取数据,仅此而已。为此使用
LIMIT和OFFSET。 -
在获得下一部分之前使用 CURSOR 并获得少量结果。
-
CUROSR 是一个 PL/pgSQL 功能,但在我的情况下,我需要将数据检索到 javascript 上下文中。
标签: javascript node.js postgresql typescript rxjs