1

我想知道使用 deepstream record.getList 存储许多唯一值是好还是坏,例如电子邮件或任何其他唯一标识符。主要目的是能够快速回答问题,例如,我们是否已经拥有使用此类电子邮件(正在使用的电子邮件)的用户或特定唯一字段的其他记录。

我今天做了一些实验,遇到了两个问题:1)当我试图用我得到的几千个值填充列表时

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory

我的深层服务器关闭了。我可以通过使用此标志向服务器节点进程添加更多内存来修复它

--max-old-space-size=5120

它看起来不太好,但允许我列出超过 5000 项的列表。

2)这对我的测试来说还不够,所以我预先创建了包含 50000 个项目的列表,并将数据直接放入 rethinkdb 表中,并在获取列表或修改列表时遇到了另一个问题:

RangeError: Maximum call stack size exceeded

我能够用另一个标志修复它:

--stack-size=20000

它有帮助,但我相信当列表大小达到适当值时,其中一个错误出现在生产中只是时间问题。我真的不知道是 nodejs、javascript、deepstream 还是 rethinkdb 问题。总的来说,这让我觉得我尝试以错误的方式使用 deepstream List。请告诉我。先感谢您!

4

1 回答 1

2

虽然您可以使用列表来存储字符串数组,但它们实际上是作为记录名称的集合 - 实际数据将存储在记录本身中,列表仅管理记录的顺序。

话虽如此,有两个开放的 Github 问题可以通过发送更有效的增量引入分页选项来提高超长列表的性能

然而,关于记忆的有趣结果,绝对是需要更优雅地处理的东西。同时,您可以通过将更新合并为一个来显着提高性能:

var myList = ds.record.getList( 'super-long-list' );

// Sends 10.000 messages
for( var i = 0; i < 10000; i++ ) {
    myList.addEntry( 'something-' + i );
}

// Sends 1 message
var entries = [];
for( var i = 0; i < 10000; i++ ) {
    entries.push( 'something-' + i );
}

myList.setEntries( entries );
于 2016-03-19T18:11:16.200 回答