相关疑难解决方法(0)

在关键服务器上(数十亿个文件名)对字符串进行内存约束的外部排序,并对重复项进行组合和计数

我们的服务器生成{c521c143-2a23-42ef-89d1-557915e2323a}-sign.xml日志文件夹中的文件.第一部分是GUID; 第二部分是名称模板.

我想计算具有相同名称模板的文件数.例如,我们有

{c521c143-2a23-42ef-89d1-557915e2323a}-sign.xml
{aa3718d1-98e2-4559-bab0-1c69f04eb7ec}-hero.xml
{0c7a50dc-972e-4062-a60c-062a51c7b32c}-sign.xml
Run Code Online (Sandbox Code Playgroud)

结果应该是

sign.xml,2
hero.xml,1
Run Code Online (Sandbox Code Playgroud)

可能的名称模板的总种类是未知的,可能超过int.MaxValue.

服务器上的文件总数未知,可能超过int.MaxValue.

要求:

最终结果应按名称模板排序.

该工具将运行的服务器是超级关键的.在运行工具之前,我们应该能够告诉内存使用情况(MB)和生成的临时文件数(如果有),并且不知道日志文件夹的任何特征.

我们使用C#语言.

我的想法:

  • 对于前5000个文件,计算出现次数,将结果写入Group1.txt.
  • 对于第二个5000个文件,计算出现次数,将结果写入Group2.txt.
  • 重复,直到处理完所有文件.现在我们有一堆组文件.

然后我合并所有这些组文件.

   Group1.txt     Group2.txt   Group3.txt     Group4.txt   
       \            /            \                /
       Group1-2.txt                Group3-4.txt
                  \                 /
                    Group1-4.txt
Run Code Online (Sandbox Code Playgroud)

Group1-4.txt 是最后的结果.

我和我朋友之间的分歧是我们如何计算事件的数量.

我建议使用字典.文件名模板是关键.设m为分区大小.(在这个例子中它是5000.)然后时间复杂度O(m),空间复杂度O(m).

我的朋友建议对名称模板进行排序,然后在一次传递中对事件进行计数,因为相同的名称模板现在都在一起.时间复杂度O(m log m),空间复杂度O(m).

我们无法说服对方.你们看到这两种方法有什么问题吗?

c# sorting algorithm dictionary large-data

7
推荐指数
2
解决办法
1854
查看次数

标签 统计

algorithm ×1

c# ×1

dictionary ×1

large-data ×1

sorting ×1