gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:55:20 27 4
gpt4 key购买 nike

我有一个大约 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 似乎是个问题。

服务器规范:

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

我在网上找遍了,只能找到一个巨大文件为 1GB 的示例(让我咯咯地笑)。

有人有什么建议吗?

最佳答案

加速这种文件访问的好方法是 memory-map the entire file into address space并让操作系统负责从它需要的文件中读取任何位。因此,做与您现在正在做的相同的事情,除了从内存中读取而不是使用 BinaryReader/seek/read。

您有很多主内存,因此这应该会提供相当不错的性能(只要您使用的是 64 位操作系统)。

关于c# - 使用 C# 对巨大的二进制文件进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7604900/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com