用 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_diff
和array_intersect
或其他任何东西。以上是关于用 php 和 mongo 处理巨大的数组的主要内容,如果未能解决你的问题,请参考以下文章
用PHP查询mongo数据时,条件是某个字段(A为数组)不为空,但是有的记录中并没有字段A,这个条件怎么写?