.net4 IIS7의 병렬 웹 환경에서 파일에 레코드를 쓰는 (추가하는) 가장 좋은 방법은 무엇입니까? 나는 ashx http handler를 사용하여 파일에 빠르게 기록되어야하는 데이터의 작은 부분을 받는다.로드가 높은 .ashx http 핸들러에서 디스크 파일에 레코드를 추가하는 가장 빠르고 안전한 방법은 무엇입니까?
using (var stream = new FileStream(fileName, FileMode.Append, FileAccess.Write, FileShare.ReadWrite, 8192))
{
stream.Write(buffer, 0, buffer.Length);
}
을하지만 일부 레코드는 아마 때문에 FileShare.ReadWrite의, 깨지거나 불완전 한 것으로 나타났습니다 : 우선 사용. 다음으로 FileShare.Read로 변경하려고했습니다. 거기에 다음 깨진 레코드가 있지만, 때때로이 예외가 있어요 : System.IO.IOException : 프로세스가 파일을 액세스 할 수 없습니다 ... 다른 프로세스에서 사용되고 있기 때문에.
이상적으로 모든 레코드가 결국 기록 될 수 있도록 운영 체제에서 동시 쓰기 요청을 큐에 넣길 바랍니다. 어떤 파일 액세스 API를 사용해야합니까?
좋아, 자물쇠를 추가하고 파일을 열어 두는 것은 성능 저하없이 트릭을 수행하는 것처럼 보이지만 지금은 또 다른 문제가 있습니다. 거기에 더 많은 하나의 파일을 쓰고, 그것은 매 시간 (새 파일이 만들어집니다), 그래서 열린 파일 스트림을 저장하기위한 스레드 안전 수집이 필요하고 새로운 하나를 추가하는 것이 필요합니다 전환됩니다. 지금은 ConcurrentDictionary을 사용합니다. 더 빠른 것이 있는지 궁금하십니까? –
PanJanek
@PanJanek 현재 시간 이외의 다른 것을 쓰고 있습니까? 왜 사전이 필요한지 잘 모르겠다. –
한 시간에서 여러 시간으로 파일을 변경하는 것 외에도 다른 비즈니스 클라이언트 (요청 매개 변수 중 하나에 의해 식별 됨)의 요청을 다른 파일에 씁니다. 매시간 약 2-3 개의 서로 다른 파일이 열립니다. – PanJanek