2011-01-24 9 views
1


초기화 할 때 그래프를 생성하는 응용 프로그램이 있는데 그 그래프에서 가장 짧은 경로의 모든 쌍을 수행하고 나중에 결과를 사용합니다.파일 읽기/쓰기 빠른 파일 읽기/쓰기

그래프가 상당히 커지기 때문에 10-12 분 정도의 시간이 걸리며 그래프는 매번 같기 때문에 매트릭스를 한 번 계산하고 나중에 덤프하고 다시 사용할 수 있습니다.

그러나,이 시간은 메모리가 덜하며 배열만큼 35M 등의 요소를 가질 수로 어레이를 판독하는 데 걸리는 경우에만 의미한다. (1 바이트 각각 35M)

약간 빠른 방법이 있는가 이것이 달성 될 수 있도록 데이터를 덤핑/판독하는 것.

덕분에 하드 드라이브의 상단 제한 속도로 실행하겠습니다 어떤 시점에서

+1

HDD의 일반적인 속도는 60-100Mb/s입니다. – ruslik

답변

2

사용 가능한 옵션 수는 운영 체제에 따라 다릅니다. 가상 메모리 시스템에는 일반적으로 메모리 공간의 일부를 파일에 매핑하고 필요에 따라 페이지를 자동으로 전송하는 방법이 있습니다.

파일 시스템이있는 대부분의 운영 체제에서 파일 버퍼를 늘리면 파일 읽기 및 쓰기 성능이 크게 향상 될 수 있습니다. 기본적으로 C++ 및 C 런타임 라이브러리는 약 512 또는 1024 바이트의 버퍼를 사용합니다. 응용 프로그램에 대해 버퍼를 1 - 40MB 근처로 늘리십시오.

성능을 향상시키는 또 다른 방법은 데이터 구조를 다시 생각하는 것입니다. 어쩌면 더 작게 만들 수 있고 더 나은 참조 지역을 가질 수 있습니다. 서로 가까이있는 항목은 이미 버퍼링되거나 캐시 될 가능성이 큽니다.

사실 파일을 모두 작성해야합니까?

+0

그럼 하드 코딩 하시겠습니까? – sud03r

+0

@ Neeraj : 무슨 뜻인지 모르겠습니다. 버퍼 크기는 [setvbuf()] [http://en.wikipedia.org/wiki/Setbuf#setbuf] 및 [setbuf()] [http://www.cplusplus.com/reference]를 사용하여'stdio'에 대해 증가합니다./iostream/filebuf/setbuf /]를 사용하십시오. – wallyk

+0

나는 실제로 당신의 질문에 "실제로 파일을 전부 쓰는 것이 필요한가?"라고 대답했다. – sud03r

0

.

가장 간단한 최적화는 읽고있는 하드웨어를 향상시키는 것입니다. 한 가지 옵션은 solid-state drive입니다. 또는 데이터를 읽을 수있는 RAM disk을 만들 수 있습니다. 이들 중 하나는 프로그래밍 언어와 별개로 너무 많은 노력 없이도 속도를 크게 향상시켜야합니다.

0

예, 파일을 메모리 맵핑하십시오. 이식성을 위해 boost :: mapped_file을 사용할 수 있습니다.

0

실행중인 컴퓨터가 변경되지 않거나 이식 할 필요가 없다는 것을 알고 있다면 깊이 우선 탐색을 수행하고 각 노드를 이진 파일에 기록 할 수 있습니다.

fwrite(currNode, sizeof(Node), 1, out); 

읽기 당신은 더 자동화 된 솔루션을 부스트 직렬화를 사용으로 볼 수 있었다 반대

Node theNode; fread(&theNode, sizeof(node), 1, in); 

될 것이다. 나는 결코 그것을 사용하지 않고, 그냥 지나친다고 언급했다.

그래프는 항상 같기 때문에 프로그램에 하드 코드 할 수있다.

가장 야심적인 해결책은 템플릿 메타 프로그래밍 기술을 사용하여 그래프를 다시 작성하는 것입니다. 이를 통해 컴파일 타임에 맵을 변경할 수 있습니다. 그것은 당신의 컴파일러에 막대한 부담을 줄 것이지만, 메모리에있는 그래프를 런타임에 가지게 될 것입니다.