2009-04-17 8 views
0

내 응용 프로그램에 많은 양의 데이터를 써야합니다. 데이터는 주기적으로 도착하여 대기열로 푸시됩니다.파일에 데이터를 쓰는 가장 효율적인 방법은 무엇입니까?

//producer 
queue_.push(new_data);// new_data is a 64kb memory range 
PostThreadMessage(worker_thread_id_, MyMsg, 0, 0);//notify the worker thread 

그 후,이 데이터를 파일에 기록해야합니다. 큐에서 데이터를 가져 와서 쓰는 다른 스레드가 있습니다.

//consumer 
while(GetMessage(msg, 0, 0)) 
{ 
    data = queue_.pop(); 
    WriteFile(file_handle_, data.begin(), data.size(), &io_bytes, NULL); 
} 

이것은 간단하지만 효율적이지 않습니다. 또 다른 중요한 점은 IO 완료 포트를 사용하는 것입니다.

//producer 
//file must be associated with io completion port 
WriteFile(file_handle_ 
     , new_data.begin() 
     , new_data.size() 
     , &io_bytes 
     , new my_overlaped(new_data)); 

소비자는 사용되지 않은 버퍼

my_completion_key* ck = 0; 
my_overlapped* op = 0; 
DWORD res = GetQueuedIOCompletionStatus(completion_port_, &io_bytes, &ck, &op); 
//process errors 
delete op->data; 

선호하는 방법은 윈도우에서의 I/O 작업 파일의 많은 양을 수행하기 위해, 무엇

을 삭제한다?

답변

1

현재 접근 방식에서 어떤 종류의 문제가 발생했는지 명확하지 않기 때문에 말하기가 어렵습니다. 전용 "Writer"스레드에서 비동기로 처리하면 성능이 크게 향상되지 않습니다.

작지만 자주 쓰는 경우 (WriteFile의 빈번한 비용이 병목 현상이되기 때문에) 일부 볼륨 임계 값에 도달하면 데이터를 수집하고 파일로 플러시하는 일종의 지연 쓰기를 구현하는 것이 좋습니다.

관련 문제