使用C#对巨大的二进制文件进行排序

Jef*_*Pry 6 c# binary binaryfiles large-data

我有一个大约400 GB的大文件.每天由外部封闭系统生成.它是一个二进制文件,格式如下:

byte[8]byte[4]byte[n]
Run Code Online (Sandbox Code Playgroud)

其中n等于byte [4]的int32值.

此文件没有分隔符,要读取整个文件,您只需重复直到EOF.每个"项"表示为字节[8]字节[4]字节[n].

该文件看起来像

byte[8]byte[4]byte[n]byte[8]byte[4]byte[n]...EOF
Run Code Online (Sandbox Code Playgroud)

byte [8]是一个64位数字,表示由.NET Ticks表示的一段时间.我需要对此文件进行排序,但似乎无法找出最快的方法.

现在,我将Ticks加载到struct和byte [n]的开始和结束位置,并读取到文件的末尾.在此之后,我通过Ticks属性在内存中对List进行排序,然后打开BinaryReader并以Ticks顺序查找每个位置,读取byte [n]值,并写入外部文件.

在过程结束时,我最终得到一个已排序的二进制文件,但它需要FOREVER.我正在使用C#.NET和一个非常强大的服务器,但磁盘IO似乎是一个问题.

服务器规格:

  • 2x 2.6 GHz Intel Xeon(Hex-Core with HT)(24线程)
  • 32GB RAM
  • 500GB RAID 1 + 0
  • 2TB RAID 5

我看过整个互联网,只能找到一个巨大的文件是1GB的例子(让我轻笑).

有人有建议吗?

Gre*_*ill 7

加速这种文件访问的好方法是将整个文件内存映射到地址空间,并让操作系统负责读取所需文件中的任何位.所以做你现在正在做的事情,除了从内存中读取而不是使用BinaryReader/ seek/read.

你有很多主内存,所以这应该提供相当好的性能(只要你使用的是64位操作系统).


Pub*_*bby 5

使用合并排序.它在线并且很好地并行化.

http://en.wikipedia.org/wiki/Merge_sort