用 php 和 mongo 处理巨大的数组

Posted

技术标签:

【中文标题】用 php 和 mongo 处理巨大的数组【英文标题】:Handle huge array with php and mongo 【发布时间】:2017-10-23 07:26:25 【问题描述】:

这些是我目前的工具:php、Mongo、Mongo in memory。

我们有一个功能可以在高峰期达到 2 组 2000 万封电子邮件。

现在我们需要比较这两个数组并找出它们之间的差异。

    您建议如何将这个电子邮件列表存储在 mongo 中?

      一个包含大数组的文档(无效,16mb 限制) 或多个文档,每个文档都有一个电子邮件

    您建议如何比较这两个列表?

如果我在 php 代码的内存中执行此操作,则数组中的 1M 封电子邮件大约为 140mb 所以 2000 万封电子邮件将是 2.8GB 的​​巨大内存

对于以下cmets:

这些是用户名列表,即:

['john', 'dan', 'sarah'] ['dan', 'samantha', 'donald']

我想比较这些列表并删除重复的,所以我会得到:

['john', 'sarah'] ['samantha', 'donald']

您可以看到 Dan 已被删除,因为他在两个名单上。

【问题讨论】:

mongodb中已经有一个文档的限制。一个文档不能超过 16MB。您可以使用这两个选项的混合模型。或者你可以根据情况做一些完全不同的事情。例如,这 2000 万封电子邮件将如何发送?他们之间的差异是什么意思?将来会填充这些数组还是仅填充静态数组。等等。 感谢@barbakini 刚刚更新了帖子 【参考方案1】:

不要存储和比较字符串本身。

    在表中添加一个新列,命名为hash。 此hash 列必须能够保留至少uint32 数字(无符号整数,32 位)。 使用crc32 作为哈希。 现在加载/比较哈希而不是字符串。

【讨论】:

所以比较数字更便宜...但我仍然需要该哈希中的用户名?你仍然会如何处理这些大数字? @TzookBarNoy 你想问什么“但我仍然需要该哈希中的用户名?”问题?如果您的意思是您需要将哈希转换为名称(或再次发送电子邮件) - 您有一个表格。 @TzookBarNoy “还有你将如何处理这些大数字” - 大数字在哪里? int32 对你来说是一个大数字吗? 这不是问题 :) 我需要这些用户名。因此,您是说将每个文档的哈希和电子邮件存储在 mongo 中。我所说的大数字是指要处理的记录数量,20M。你会做比较吗? 在内存中拥有所有哈希值(基本上是数字)后,您就可以使用array_diffarray_intersect 或其他任何东西。

以上是关于用 php 和 mongo 处理巨大的数组的主要内容,如果未能解决你的问题,请参考以下文章

用PHP查询mongo数据时,条件是某个字段(A为数组)不为空,但是有的记录中并没有字段A,这个条件怎么写?

用巨大的数组填充表

nodeJs巨大的数组处理抛出RangeError:超过最大调用堆栈大小

对象数组与对象上的 Mongo 索引

php自定义函数及内部函数----数组处理函数

Mongoose/Mongo:更新不保存