检查数据密集型应用程序中的重复输入项
Posted
技术标签:
【中文标题】检查数据密集型应用程序中的重复输入项【英文标题】:Check for duplicate input items in a data-intensive application 【发布时间】:2021-06-27 09:35:42 【问题描述】:我必须构建一个服务器端应用程序,它将接收一个数据流作为输入,它实际上会接收一个最多九个十进制数字的整数流,并且必须将它们中的每一个写入一个日志文件。输入数据是完全随机的,其中一项要求是应用程序不应将重复项写入日志文件,并应定期报告找到的重复项的数量。
考虑到性能是这个应用程序的一个关键方面,因为它应该能够处理大量工作(和并行工作),我想找到一个适当的解决方案来跟踪重复条目,因为每次写入时检查整个日志(文本)文件肯定不是一个合适的解决方案。我可以想到一个解决方案,包括在内存中维护某种数据结构以跟踪到目前为止正在处理的整个数据流,但是由于输入数据可能非常高,我认为这不是最好的方法它要么...
有什么想法吗?
【问题讨论】:
整数作为存储在 32 位或 64 位中的“小”整数?还是整数,如由数字组成的长字符串?您的数据是否有某种结构,或者它是完全随机的,也许是哈希码?我认为这里有一个例子会很有用。 整数最多9位十进制数字,数据完全随机 【参考方案1】:假设随机整数流是均匀分布的。跟踪重复项最有效的方法是在内存中维护一个 100 亿位的巨大位图。但是,这需要大量 RAM:大约 1.2 Gio。但是,由于这种数据结构很大,内存访问可能会很慢(受内存层次结构的延迟限制)。
如果排序无关紧要,您可以使用多个线程来减轻内存延迟的影响。可以使用逻辑原子操作安全地完成并行访问。 要检查之前是否已经看到某个值,您可以检查位图中某个位的值,然后设置它(如果并行完成,则自动设置)。
如果您知道您的流确实包含少于一百万个整数,或者随机整数流不是均匀分布的,您可以使用散列-设置数据结构,因为它以更紧凑的方式(按顺序)存储数据。
布隆过滤器可以帮助您在流中的值数量很大并且重复项很少时加快过滤速度(如果您愿意,此方法必须与另一种方法结合使用获得确定性结果)。
这是一个在 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
【讨论】:
以上是关于检查数据密集型应用程序中的重复输入项的主要内容,如果未能解决你的问题,请参考以下文章