일반 텍스트 파일 읽기 성능 향상

일반 텍스트 파일 읽기 성능 향상

우리 생물정보학 애플리케이션에는 대용량 파일(최대 900MB, 일반적으로 100MB)이 있습니다. 이러한 파일에는 게놈의 명확한 텍스트 표현이 포함되어 있으며 기본적으로 문자 시퀀스가 ​​포함된 한 줄 파일입니다.

데이터는 위치를 기준으로 참조됩니다. 예를 들어 염색체 7은 위치 1에서 시작하여 위치 158937463에서 끝납니다. 일반적으로 약 400자의 작은 부분을 추출합니다(예: 위치 4,120,000에서 4,120,400까지).

이 목적을 위해 Ruby로 작성된 유틸리티가 있습니다.https://github.com/sfcarroll/bio-fasta-read파일을 처음부터 읽어서 작동합니다.

이러한 읽기 작업을 여러 번 수행하면 애플리케이션 속도가 느려집니다. 캐싱에 어떤 옵션을 사용할 수 있는지 알고 싶습니다. 소스 데이터는 절대 변경되지 않지만 범위는 자주 변경됩니다. 우리는 128GB RAM이 있는 시스템에서 Ubuntu Server 14 x64를 실행하고 있습니다.

성능을 향상시킬 수 있는 OS 수준의 방법이 있습니까? 전체 파일을 메모리에 로드하거나 요청을 어떻게든 캐시할 수 있을까요?

편집하다

도움이 될 만한 몇 가지 옵션(어떻게든 파일 캐시에 더 많은 메모리를 할당하는 것과 같은)이 있다면 포인터가 매우 유용할 것이라고 덧붙여야 합니다. 특정 방식으로 조정해야 하는 경우 전용 서버를 사용하여 이러한 파일을 읽는 것을 고려할 수 있습니다.

편집 2 우리는 듀얼 SSD(레이드 가능)와 128GB RAM을 갖춘 Xeon E5-1650 6코어 CPU를 실행하고 있습니다.

답변1

Linux 커널은 캐시 관리를 자동으로 수행합니다. RAM에 로드된 모든 항목은 다른 프로세스에서 RAM이 필요하고 사용 가능한 메모리가 더 이상 없을 때까지 그대로 유지됩니다. 따라서 Linux 커널에서는 RAM이 항상 가득 차 있어야 합니다. 시스템에는 128GB의 RAM이 있으며 이는 100-1000MB 사이의 파일을 저장하기에 충분합니다.

대용량 파일을 RAM에 로드하려면 다음을 수행하십시오 cat.

cat huge_file > /dev/null 2>&1

모든 출력은 으로 전송되지만 /dev/null이를 위해서는 시스템 RAM을 통과해야 합니다. 이렇게 하면 어떻게 Cached증가하는지 확인할 수 있습니다 /proc/meminfo.

완료되면 catRuby 애플리케이션을 실행합니다. 이제 Ruby 애플리케이션은 대용량 파일의 캐시된 버전을 읽습니다.

답변2

dd이전의 모든 내용을 읽지 않고 파일의 일부를 읽는 데 사용됩니다 . 귀하의 예(바이트 4,120,000-4,120,400 읽기)의 경우 다음을 사용할 수 있습니다.

dd bs=400 건너뛰기=10300 개수=1 if=입력 파일  =의출력 파일

이는 400바이트의 논리 블록 크기를 정의한 다음 dd입력 파일( ) if의 처음 10300개 "논리 블록"을 건너뛰도록 지시합니다. 10,300은 4,120,000 ¼ 400입니다. 그런 다음 count=1400바이트 블록( )을 읽고 이를 출력 파일( of)에 씁니다. 사양을 생략하면 of표준 dd출력이 작성되어 파이프로 연결할 수 있습니다.

시작점(오프셋)이 블록 크기의 정수배가 보장되지 않는 경우(또는 설사 그렇더라도) 다음과 같은 더 까다로운 작업을 수행할 수 있습니다.

(dd bs=10000 건너뛰기=412 개수=0; dd bs=400 개수=1개=출력 파일) <입력 파일

또는

(dd bs=4120000 건너뛰기=1 개수=0; dd bs=400 개수=1개=출력 파일) <입력 파일

어디

  • 마찬가지로 사양을 생략할 수 of있으며 이는 표준 출력에 기록됩니다.
  • 지정 dd하지 않고 실행 하면 표준 입력에서 읽습니다. if전체 명령 그룹에 대한 표준 입력은 (dd …; dd …)끝에서 나옵니다.< your_input_file
  • 첫 번째 명령은 검색만 하기 dd때문에 데이터를 읽거나 쓰지 않습니다 .count=0
  • dd두 명령 모두 동일한 I/O 리디렉션에서 표준 입력을 받기 때문에 첫 번째 명령으로 수행된 조회는 두 번째 명령으로 표시되는 파일 포인터에 영향을 미칩니다.

관련 정보