우리 생물정보학 애플리케이션에는 대용량 파일(최대 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
.
완료되면 cat
Ruby 애플리케이션을 실행합니다. 이제 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=1
400바이트 블록( )을 읽고 이를 출력 파일( 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 리디렉션에서 표준 입력을 받기 때문에 첫 번째 명령으로 수행된 조회는 두 번째 명령으로 표시되는 파일 포인터에 영향을 미칩니다.