2014-05-11 3 views
1

파일 찾기에 대한 질문이 있습니다.파일에서 데이터를 더 빨리 읽으십시오.

나는 pcap 파일을 가지고 있으며 특정 패킷을 찾아야합니다. 지금까지 패킷을 찾는 코드는 다음과 같습니다.

while (!find_the_packet) 
{ 
    pcap_next_ex(p_pcap, &header, &data); //read the next packet 
    check_if_the_packet_found(); 
} 

좋은 결과를 얻었습니다.

내 목표는 패킷을 더 빨리 찾는 것입니다. 패킷을 찾을 때까지 패킷별로 확인하지 않습니다.

그래서 (key, value)를 사용하여 데이터베이스 - 해시 맵을 만들었습니다. pcapnav_goto_offset(pcapnav_t *pn, off_t offset, pcapnav_cmp_t boundary)

나는이 기능은 fseek과를 사용하는 것을보고 다음

key -> No. of the packet 
value -> the packet itself (or the location of the packet) 

나는 또한 pcapnav 라이브러리 함수를 발견이라고 할 수 있습니다. FSEEK가 순차적으로 작동하기 때문에 내 데이터베이스가별로 도움이되지 않습니다.

내 질문 -

은 실제로 작동합니까? 덩어리로 덩어리 읽기? 어떻게 작동합니까? 나는 조금 혼란 스럽다.

만약 그렇다면, pcap 파일로부터 특정 패킷 \ 데이터 청크를 얻는 더 빠른 방법이 있는가?

고맙습니다.

+1

네가 ['fseek'] (http://en.cppreference.com/w/c/io/fseek)에 대해 틀렸어. 다음 번 읽기/쓰기가 일어날 위치를 설정 했어. 기본적으로 변수 할당 일뿐입니다. –

+1

기본 파일 시스템에 따라 다르지만 fseek (및 다음 읽기)는 최신 구현에서 거의 일정한 시간 동안 작동하는 것으로 알려져 있습니다. – Marian

+0

안녕하세요, 감사합니다. 이것은 내 혼란입니다. 위치가 파일 내부의 특정 지점으로 설정되고 현재 위치에서 300MB라고 가정 해 봅시다. 커서가 다음 읽기 \ 쓰기 위치로 즉시 이동합니까? – user3378689

답변

2

Fseek는 기본 라이브러리 (libc)에만 다음 읽기가 수행되어야한다고 말합니다. 그러면 Libc는 요청을 운영 체제로 전달합니다 (일반적으로 lseek 시스템 호출 사용). 따라서 주어진 위치에서 읽으려면 두 개의 시스템 호출 (lseek, read)과 하나의 복사본 (읽기가 파일 시스템 버퍼 (일명 cache)에서 프로그램의 주소 공간까지 수행)이 있어야합니다.

읽을 파일이 사용 가능한 RAM의 크기보다 작 으면 대부분 cached이되며 benefit from mmap-ing it이됩니다. 이 경우 운영 체제에 게으른 prefetch (madvise 또는 PrefetchVirtualMemory 사용) 파일을 요청할 수도 있습니다. 파일이 사용 가능한 RAM보다 크거나 산발적으로 액세스되는 경우 디스크 I/O에 의해 읽기 속도가 제한되어 seek + read와 mmap 간의 차이가 발생합니다.

+0

도움이되는 답변에 감사드립니다. 내가 이해할 수 있는지 알아 보도록하겠습니다. 사용 가능한 RAM이 512B이고 5GB를 찾고 싶다면 운영 체제가 5GB \ 512B 청크 (청크로 청크)를 "가져 와서"아무것도하지 말고 그 다음에 만 그것은 (5GB \ 512B) 청크 읽기를 수행합니까? – user3378689

+0

그리고 더 빨리 만들 수있는 유일한 기회는 파일의 내용을 프로그램의 메모리에로드하고 MAP (키, 값)에 정렬하는 것입니다. 검색을 수행 할 때 와서 빠른 속도 (MAP 시간)가 달라집니다. – user3378689

+0

@ user3378689 아니요, 파일 시스템은 파일을 순차적으로 스캔하지 않으며, 디스크의 어디에 정확하게 5GB인지 알려주는 맵을 가지고 있습니다 (http://en.wikipedia.org/wiki/Inode_pointer_structure 참조). 그리고 파일이 사용 가능한 RAM보다 큰 경우 파일을 RAM에로드하여 속도를 향상시킬 수 없습니다. – ArtemGr

관련 문제