我的问题如下:
这不是面试问题或类似问题。对于业务案例,我需要这样做。
是否有一种算法可以让我实现这个目标(最好在不到一个月的时间内)?我的第一个想法是Bloom / Cuckoo过滤器,但我想尽可能保留所有URL。
答案 0 :(得分:2)
我将实现合并排序,并在合并步骤中消除重复项。
您将要流传输URL,并创建可在内存中排序的大小适中的批处理。这些排序的块中的每一个都被写入磁盘。
要合并这些排序的块,请流式传输两个(或更多)文件。查看每个流中的下一个URL,并从流中获取最小的URL,并跟踪最新输出的URL。当获得下一个最小的URL时,将其与最近输出的URL进行比较-如果重复,则跳过它;否则将其输出(并记住它是最新输出)。
如果创建的已排序块使您一次打开的文件过多,请继续合并文件组,直到只有一个文件为止。此结果将没有重复。
您可能会使用Arrays.parallelSort()
对初始块进行内存内排序。在输出排序后的数组元素时,可能会从这些最初排序的块中删除重复项而受益。
绝对使用缓冲的I / O。
合并多个文件时,我将创建一个优先级队列,该队列具有每个流的下一条记录以及它来自哪个流。您从优先级队列中获取下一个项目,从下一个项目所来自的流中读取下一行,并将该新行放入队列中。可以合并的流的数量将受到可以打开的文件数或所有流中缓冲I / O所需内存的限制。
要实现这一点,可能需要一页左右的代码-在一台机器上运行它很简单。但是,如果适合您的基础架构,则此问题非常适合Hadoop集群或类似的集群。如果您想在例如AWS上快速运行,您可能希望使用队列(例如AWS上的SQS)来管理要排序/合并的块-它涉及更多,但运行得更快。 / p>
其他注意事项