微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

检查数据密集型应用程序中的重复输入项

如何解决检查数据密集型应用程序中的重复输入项

我必须构建一个服务器端应用程序,它将接收数据流作为输入,它实际上将接收最多九位十进制数字的整数流,并且必须将它们中的每一个写入日志文件。输入数据完全随机,其中一项要求是应用程序不应将重复项写入日志文件,并应定期报告发现的重复项数。

考虑到性能是这个应用程序的一个关键方面,因为它应该能够处理高负载(和并行工作),我想找到一个合适的解决方案来跟踪重复条目,如每次写入时检查整个日志(文本)文件肯定不是一个合适的解决方案。我可以想到一个解决方案,包括在内存中维护某种数据结构以跟踪目前正在处理的整个数据流,但由于输入数据可能非常高,我认为这不是最好的方法它要么...

有什么想法吗?

解决方法

假设随机整数流均匀分布。跟踪重复项的最有效方法是在内存中维护一个 100 亿位的巨大位图。但是,这需要大量 RAM:大约 1.2 Gio。然而,由于这个数据结构很大,内存访问可能会很慢(受内存层次结构的延迟限制)。

如果顺序无关紧要,您可以使用多个线程来减轻内存延迟的影响。使用逻辑原子操作可以安全地进行并行访问。 要检查之前是否已经看到某个值,您可以检查位图中某个位的值,然后对其进行设置(如果并行完成,则以原子方式进行)。

如果您知道您的流确实包含少于一百万个整数或者随机整数流不均匀分布,您可以使用哈希-set 数据结构,因为它以更紧凑的方式(按顺序)存储数据。

Bloom 过滤器 可以帮助您在流中的值数量非常大且重复项很少时加快过滤速度(如果需要,此方法必须与另一种方法结合使用)获得确定性结果)。

以下是在 Python 中使用哈希集的示例:

seen = set()                 # List of duplicated values seen so far
for value in inputStream:    # Iterate over the stream value
    if value not in seen:    # O(1) lookup
        log.write(value)     # Value not duplicated here
        seen.add(value)      # O(1) appending

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。