使用深度列表获取数万个唯一值

时间:2016-03-19 14:35:12

标签: deepstream.io

我想知道使用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。请告诉我。提前谢谢!

1 个答案:

答案 0 :(得分:2)

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

话虽如此,有两个开放的Github问题可以通过sending more efficient deltasintroducing a pagination option

提高很长列表的效果

有关内存的有趣结果,绝对需要更优雅地处理。与此同时,您可以通过将更新合并为一个来大幅提高性能:

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 );