我想对一个充满20kb记录的多TB文件进行排序。我只需要从每条记录中读取几个字节即可确定其顺序,因此可以对内存中的索引进行排序。
但是,我无法将记录本身存储在内存中。随机访问比顺序访问要慢,我也不想对输出文件进行随机访问写操作。有没有已知的算法可以利用排序索引来“策略化”将记录从输入文件复制到输出文件的重新排列的最佳方式?
答案 0 :(得分:1)
根据排序索引算法有重新排序数组,但是它们涉及随机访问。即使是固态硬盘,虽然随机访问本身也不成问题,但由于随机访问而一次读取或写入一条记录的吞吐量比一次读取或写入多条记录的速度要慢,而后者通常会被外部读取或写入合并排序。
对于典型的外部合并排序,文件以“块”读取,其大小足够内部排序以对“块”进行排序,然后将排序后的“块”写入外部媒体。在此初始遍历之后,在“合并块”上进行k次合并,将合并的“合并块”的大小乘以每次合并遍历上的k,直到生成单个已分类的“合并块”。读/写操作可以一次读取多个记录。假设您有1GB的ram并使用16向合并。对于16路合并,将使用16个“输入”缓冲区和1个“输出”缓冲区,因此缓冲区大小可以为63MB(1GB / 17舍入为可变空间的一位),这将允许在3650条记录中读取或写入3150条记录。时间,从而大大减少了随机访问和命令开销。假设初始遍创建了大小为0.5 GB的已排序块,经过3次(16路)合并之后,块大小为2TB,经过4次遍之后,则为32TB,依此类推。