2012-12-31 3 views
0

TPL을 사용하여 큐에 대해 병렬로 처리하는 C# 프로세스가 있습니다. 각 레코드를 처리 한 후 처리 된 각 레코드 ID의 실제 레코드를 설정하여 프로세스가 실패하거나 중단되면 두 번째로 해당 레코드를 처리하지 않도록 할 수 있습니다. 레코드는 한 번만 처리해야합니다.처리 된 레코드 유지

레코드 ID를 간단한 텍스트 파일과 Sqlite 테이블에 직렬화하려고했습니다. 두 경우 모두 작은 레코드 ID (Guid 's)를 저장하는 시간은 레코드 자체의 전체 프로세스 시간의 50 %를 차지합니다. 나도 열고 Sqlite 연결을 사용하려고 시도하고 삽입을 할 parameritized 삽입 쿼리를 열거 나 데이터베이스 파일을 닫지 않아 그리고 더 나은 아니에요.

제 질문은, 내 프로세스가 죽으면 내게 그만 둔 곳에서 데리러 갈 수 있도록 영구적 인 방식으로 Guid (어쩌면 1000-2000) 목록을 어떻게 유지할 수 있습니까? ? 나는 서버가 재부팅되거나 프로세스가 종료되는 경우 빠른 속도로 아무 것도 시도하지 않고 계속 시도 할 것입니다.

아이디어가 있으십니까?

+0

파일과 SqlLite에 쓰기 위해 동일한 시간이 소요될 수 없습니다. 코드를 공유 할 수 있습니까? 버퍼링 된 스트림을 사용하여 올바르게 작성하면 파일에 쓰기가 매우 빠릅니다. 또한, 당신은 그 자체로 TEXT 파일에 글을 쓸 필요가 없으며, 코드를 공유 할 수 있습니까? 또한, 내 로거는 초당 1-2,000 개의 CPU로 디스크에 (테스트 장치에서) 50,000 개의 메시지를 방출합니다. 디스크에 쓰기가 모든 SQL (심지어 SQLLite)보다 빠릅니다. –

+0

SQL Server 사용 방법은 어떻습니까? – user1610015

+0

내 첫 번째 시도는 추가를 위해 파일을 열고 하나의 행을 작성하고 닫는 것이지만 속도 저하는 해당 코드 블록에 대한 액세스를 기다리는 모든 스레드에서 발생했습니다. 나는 추가, 쓰기, 닫기 사이클에 대한 공개가 너무 느렸다 고 생각한다. 프로세스가 죽으면 버퍼가 플러시되는 것을 보장하는 더 빠른 방법이 있습니까? – powlette

답변

0

재부팅에서 살아남을 수있을 정도로 오래 지속되는 내용은 조만간 (또는 더 빨리) 디스크에 기록해야합니다.

이것은 이미 선택 항목을 거의 열거했음을 의미합니다.

다음 질문은 레코드가 이미 처리되었는지 여부를 확인하는 비용과 실수로 추적 메커니즘을 제거하는 최종 사용자의 위험 수준을 묻는 것입니다.

정보를 텍스트 파일에 쓰는 경우에는 쓰기가 빠르지 만 느린 읽기 (정보를 캐시하지 않은 경우)와 사용자가 파일을 제거 할 가능성이 상당히 높습니다.

어떤 종류의 데이터베이스를 사용하는 경우에도 쓰기는 여전히 상당히 빠르며 검색은 텍스트 파일보다 빠르며 사용자가 저장소 메커니즘을 제거 할 확률이 훨씬 낮습니다.

이러한 요인에 따라 필자는 일종의 데이터베이스를 강력히 추천합니다. 필자는 성능, 구현 및 배포 비용과 유지 관리 비용을 고려한 최적의 성능을 제공하는 여러 데이터베이스를 모델링 (또는 연구)했습니다.

관련 문제