服务器和路径的大型集合的排序算法
本文关键字:排序 算法 集合 大型 路径 服务器 | 更新日期: 2023-09-27 18:00:07
在C#中工作,我想写一个高效的排序算法,将包含服务器和路径组合的未排序列表的文本文件作为输入,并输出一个排序文件。
作为一个练习,我是在输入数据大小将超过可用内存的假设下工作的,所以我考虑一次将文件读取到内存中一个块,进行快速排序(或者堆排序,也许是?),将排序后的块输出到临时文件,然后进行合并排序以产生最终输出。
输入文件的格式由我决定。它可以只是UNC路径的列表(服务器和路径为单个字符串),也可以是将服务器和路径作为单独字段的CSV。
我的问题是,在我的数据结构中,将服务器和路径作为单独的实体并单独评估它们是否有任何好处?
将服务器和路径分开将消除在路径比较运行期间比较服务器名称的需要,但需要额外的运行来按服务器排序,并且考虑到可用内存限制,将需要我以某种方式缓存已排序的服务器列表,从而增加磁盘IO开销。
是否有一些技术可以通过在输入中提供服务器和路径作为单独的字段来优化此类应用程序的性能?
考虑到数据集的性质,我可能会考虑其他优化技术吗?
编辑:这是一次性任务。我以后不需要查找条目
我正在考虑一次将文件读入内存一个区块,进行快速排序(或者堆排序,可能是?),将排序后的区块输出到临时文件,然后进行合并排序以产生最终输出。
这是一个非常合理的计划。
另一种解决方案是:在磁盘上创建一个b-tree,并将所有数据一次一条记录插入b-tree。内存中的b树永远不需要超过几页,并且可以从未排序的列表中一次读取一条记录。一旦它在b树中,就按顺序读出来。
将服务器和路径分开将消除在路径比较运行期间比较服务器名称的需要,但需要额外的运行来按服务器排序,并且考虑到可用内存限制,将需要我以某种方式缓存已排序的服务器列表,从而增加磁盘IO开销。
好的。
我的问题是,在我的数据结构中,将服务器和路径作为单独的实体并单独评估它们是否有任何好处?
你刚才说了利弊。您已经列出了它们。如果你已经知道答案,为什么还要问这个问题?
是否有一些技术可以通过在输入中提供服务器和路径作为单独的字段来优化此类应用程序的性能?
可能吧,是的。
我怎么能确定呢?
用两种方式编写代码并运行它。更好的代码会被观察到更好。
考虑到数据集的性质,我可能会考虑其他优化技术吗?
你的问题和猜测为时过早。
从设定绩效目标开始。
然后尽可能清晰、正确地实现代码。
然后仔细测量你是否达到了目标。
如果你这样做了,早点下班去海滩。
如果没有,请获取探查器,并使用它来分析程序,以找到性能最差的部分。然后优化该部分。
继续这样做,直到你达到目标,或者你放弃。
我当然不会超过Eric Lippert的答案,但从新手的角度来看,我想知道你是否没有首先寻找最复杂的答案。您不需要使用File.ReadLines
一次将文件读入内存。。。所以你的输入是一次一行。使用Uri
对象将每个字符串快速解析为其组成部分:主机和路径。
如果您正在考虑OO方法,那么一个实现IComparable
并具有路径字符串的SortedList
的"serverUri"对象如何。制作serverUri对象的SortedList
,这样部分字符串只存储一次,对于具有该服务器uri的每个路径,将其添加到子集合中。维奥拉。。。一切都安排好了。。。把它吐到磁盘上。