使用 deepstream List 获取数以万计的唯一值

Using deepstream List for tens of thousands unique values

我想知道使用 deepstream record.getList 来存储大量唯一值(例如电子邮件或任何其他唯一标识符)是否是一个 good/bad 想法。主要目的是能够快速回答一个问题,例如,我们是否已经有一个用户拥有这样的电子邮件(正在使用的电子邮件)或特定唯一字段的另一条记录。

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

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory

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

--max-old-space-size=5120

它看起来不太好,但允许我制作一个包含 5000 多个项目的列表。

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

RangeError: Maximum call stack size exceeded

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

--stack-size=20000

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

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

话虽如此,sending more efficient deltas and by introducing a pagination option

有两个未解决的 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 );