有没有用于sorting包含固定长度二进制logging的大文件的Unix工具?
换句话说,我正在寻找类似(1)的东西,但是对于具有固定长度logging的二进制文件。
我可以将文件转换为文本,然后使用sorting(1)进行sorting,然后转换回二进制表示,但我正在寻找更多的时间和空间效率。
原来你运气好, 有一个GNU风格的unix程序,完全是这样的: bsort 。
bsort是一种超级有效的就地基数sorting方式,在处理大于ram的文件时要特别注意内存访问模式。 通过高效,我的意思是能够最好的2014年年中http://sortbenchmark.org的2014年能源效率10 ^ 8的硬件logging – logging是889焦耳,这是一个早期的原型能够sorting相同在股票的MacBook Pro 335焦耳。 对于完全符合RAM(三位数兆字节)的“小”数据集,其速度比libc的qsort库快3倍。
一种解决scheme可能是将input文件转换为hex,每条logging都编码在一个单独的行上,对其进行sorting,然后转换回二进制:
record_size=32 cat input \ |xxd -cols $record_size -plain \ |sort \ |xxd -cols $record_size -plain -revert
但是,它很慢(xxd在我的机器上转换大约40MB / s)
所以,因为我需要它,所以我写了binsort ,做这个工作:
binsort --size 32 ./input ./output
使用--size 32 ,它假定32字节固定大小的logging,读取./input ,将sorting的logging写入./output 。
对于基于logging内字节位置的二进制数据,Unix的sorting实用程序是可以的,如果你引用它们相对于第一个“logging”的话。 例如-k1.28,1.32。
Unix的sorting是不太灵活的,因为它是行结束的概念。 根据您的数据,您可能可以做比一个用户68497build议的xxd更简单的stream编辑,并使用空终止的行。 尽pipe如此,这仍然可能涉及大量内存中的数据拷贝,并且不会接近基于mmap的方法的速度。
如果确实以某种方式使用unixsorting,请注意区域设置。 sorting假定它的input是文本,语言环境影响sorting顺序。