2014-09-26 5 views
1

바이너리 파일에 저장된 64 비트 숫자로 GNU Coreutils 정렬을 사용할 수 있습니까? 파일이 바이너리가 아닌 경우 sort -n이 해결책이지만 바이너리 데이터와 함께 사용하는 옵션을 찾지 못했습니다.바이너리 형식의 숫자 데이터와 함께 GNU sort를 사용하는 방법은 무엇입니까?

파일 크기가 매우 큽니다 (~ 100GB). 가능한 경우 텍스트 (이진수가 아닌) 복사본을 만들고 싶지 않습니다. 데이터의

샘플 : $ xxd file 00292e0: 4036 1eb7 6888 d319 de6b 7402 9ca9 f116 @6..h....kt..... 00292f0: db68 7f05 199f 9d36 cf01 cb28 e49f 1116 .h.....6...(.... 0029300: 0c7c 8b55 2963 ef0c 277a f2b0 38d7 2b19 .|.U)c..'z..8.+. 0029310: c83b 2614 4327 d838 820c 1bb8 444f 1731 .;&.C'.8....DO.1 0029320: 1695 cab3 cd12 092a 0691 d7e4 5fcc b01d .......*...._... 0029330: b12b 7c1b a209 7c1c 568a 125c 541c d334 .+|...|.V..\T..4 0029340: 09a3 ecbc 8370 e205 9265 7759 a378 4e2f .....p...ewY.xN/

+0

'xxd 파일'샘플을 붙여 넣을 수 있습니까? – choroba

+0

'sort (1)'이 당신을 도울 수 있다고 생각지 않습니다. 게다가,'sort (1)'은 정렬을 완료 할 때까지 모든 데이터를 메모리에 저장하기 때문에 엄청난 양의 입력으로 인해 큰 피해를 입을 것입니다. Btw, 귀하의 파일이 순전히 64 비트 숫자로 구성되어 있습니까? 즉, 파일이 64 비트 숫자의 거대한 배열입니까? 더 나은 대체 방법을 제안하기위한 자세한 정보를 제공해주십시오. – nodakai

+0

예, C++ ofstream :: write의 64 비트 숫자로만 구성됩니다. 그러나 그들은 "GNU 정렬 (모든 GNU 유틸리티에 대해 지정된대로)은 입력 행 길이에 제한이 없으며 행 내에서 허용되는 바이트에 대한 제한이 없다고 말합니다." – Dmitry

답변

0

sort(1)

여기에 도움이되지 않습니다. 작은 파일의 경우 파일을 줄로 나누어 sort(1)으로 보낼 수는 있지만 100G 파일에는 사용할 수 없습니다.

Serverfault의 this question에 대한 대답은 작업을 정확히 해결하기 위해 작성된 도구 링크가 있습니다. 거기에 github 프로젝트를 확인할 수 있습니다 (Go로 작성된 것으로 보이므로 사용하기로 결정한 경우 컴파일러를 설치해야합니다).

빠른 검색 기능은 더 많은 대중적인 언어로 작성된이 태스크에 대한 다른 인기있는 도구를 찾지 못합니다 (또한 수천 명의 학생들이 매년 자신의 CS 과정에 구현하는 병합 정렬 일뿐입니다. 그러나 그것은 주제를 벗어났습니다.)

0

bsort utility입니다.

C로 작성된 번개 빠른 내부 기수 정렬입니다. 개발을위한 테스트 사례 중 하나는 16GB 램이있는 시스템에서 100GB 파일이었습니다. 정렬에는 약 22 초 정도 걸렸습니다.

+0

예제 코드도 함께 제공하십시오. 답변에있는 도구에 대한 링크 만 제공하는 것은 좋지 않습니다. – YakovL

관련 문제