【发布时间】:2011-11-28 03:03:18
【问题描述】:
我有一个大约 400 GB 大小的大文件。由外部封闭系统每天生成。它是一个二进制文件,格式如下:
byte[8]byte[4]byte[n]
其中 n 等于 byte[4] 的 int32 值。
此文件没有分隔符,要读取整个文件,您只需重复直到 EOF。每个“项目”表示为 byte[8]byte[4]byte[n]。
文件看起来像
byte[8]byte[4]byte[n]byte[8]byte[4]byte[n]...EOF
byte[8] 是一个 64 位数字,表示由 .NET Ticks 表示的时间段。我需要对这个文件进行排序,但似乎找不到最快的方法。
目前,我将 Ticks 加载到一个结构中,并将 byte[n] 开始和结束位置并读取到文件的末尾。之后,我按 Ticks 属性对内存中的 List 进行排序,然后打开 BinaryReader 并按 Ticks 顺序查找每个位置,读取 byte[n] 值,然后写入外部文件。
在这个过程的最后,我得到了一个排序的二进制文件,但它需要永远。我正在使用 C# .NET 和一个非常强大的服务器,但磁盘 IO 似乎是个问题。
服务器规格:
- 2x 2.6 GHz Intel Xeon(Hex-Core with HT)(24 线程)
- 32GB 内存
- 500GB RAID 1+0
- 2TB RAID 5
我浏览了整个互联网,只能找到一个大文件为 1GB 的示例(让我发笑)。
有人有什么建议吗?
【问题讨论】:
-
我不确定我是否理解您如何在只有 500GB RAID 磁盘的系统上读取一个 400GB 文件并写入另一个已排序的 400GB 文件,但 Greg 的建议听起来不错,尽管我没有亲自处理这么大的文件。
-
嘿,我还有 2TB RAID 5。
标签: c# binary binaryfiles large-data