Сортировка гигантских двоичных файлов с помощью C #

У меня есть большой файл размером примерно 400 ГБ. Генерируется ежедневно внешней закрытой системой. Это двоичный файл следующего формата:

byte[8]byte[4]byte[n]

Где n равно значению int32 байта [4].

Этот файл не имеет разделителей, и чтобы прочитать весь файл, вы должны просто повторять до EOF. Каждый «элемент» представлен как байт [8] байт [4] байт [n].

Файл выглядит так, как будто

byte[8]byte[4]byte[n]byte[8]byte[4]byte[n]...EOF

байт [8] - это 64-битное число, представляющее период времени, представленный .NET Ticks. Мне нужно отсортировать этот файл, но я не могу найти самый быстрый способ сделать это.

В настоящее время я загружаю Ticks в структуру, в начальную и конечную позиции byte [n] и читаю до конца файла. После этого я сортирую список в памяти по свойству Ticks, а затем открываю BinaryReader и ищу каждую позицию в порядке Ticks, читаю значение byte [n] и записываю во внешний файл.

В конце процесса я получаю отсортированный двоичный файл, но это занимает НАВСЕГДА. Я использую C # .NET и довольно мощный сервер, но дисковый ввод-вывод кажется проблемой.

Характеристики сервера:

  • 2x 2,6 ГГц Intel Xeon (шестиядерный с HT) (24 потока)
  • 32 ГБ ОЗУ
  • 500 ГБ RAID 1 + 0
  • 2 ТБ RAID 5

I ' Я поискал в Интернете и нашел только примеры, где огромный файл составляет 1 ГБ (заставляет меня смеяться).

Есть ли у кого-нибудь совет?

6
задан Community 22 September 2017 в 17:44
поделиться