우리는 TPL Dataflow
프레임 워크를 사용하려고하는 데이터 처리 파이프 라인을 가지고 있습니다.데이터 흐름을위한 블록 디자인에서 차단됨
기본 요점 : 파일 시스템에 CSV 파일을 통해
- 반복 처리가 (10,000)
- 우리는 하나의 콘텐츠를 통해
- 반복 처리를 무시할 경우 우리가 내용을 가져 오지 않은 확인 CSV 파일 (20,000-120,000 행)을 만들고 필요에 맞는 데이터 구조를 만듭니다.
- 이러한 새 dataStructure 항목 중 100 개를 일괄 처리하여 데이터베이스에 넣습니다.
- CSV 파일을 가져올 것으로 표시합니다.
이제 우리는 매우 느린 & 고통스러운 방법으로 위의 모든 작업을 수행 기존의 파이썬 파일이 - 코드가 엉망이다.
제 생각은 TPL Dataflow
입니다.
BufferBlock<string>
는TransformBlock<string, SensorDataDto>
는 CSV 파일을 통해 읽고 작성이 파일을 가져올 지 여부를 감지하는TransformBlock<string, SensorDataDto>
조건으로 모든 파일을 게시 할 수SensorDataDto
구조BatchBlock<SensorDataDto>
이TransformBlock
내 을 사용 최대 100 개의 요청을 배치하도록 위임합니다.4.5.
ActionBlock<SensorDataDto>
을 사용하여 100 개의 레코드를 데이터베이스에 저장합니다.ActionBlock
가져온 CSV로 표시하십시오.
나는 처음 몇 작업을 만든 그들은 최선을 다하고 (BufferBlock
를 ->TransformBlock
+ Predicate
& & 프로세스 경우가 없습니다)하지만 난 게시 할 수 있도록 흐름을 계속하는 방법을 확실 해요 100을 TransformBlock
에있는 BatchBlock
으로 변경하고 다음 작업을 연결하십시오.
이 모양이 맞습니까? 기본 요령이며 TPL 데이터가 흐릿한 방식으로 BufferBlock
비트를 어떻게 처리합니까? 내가 BatchBlock.Post<..>(...)
를 호출하고있어 normaliseData
방법 내부
bufferBlock.LinkTo(readCsvFile, ShouldImportFile)
bufferBlock.LinkTo(DataflowBlock.NullTarget<string>())
readCsvFile.LinkTo(normaliseData)
normaliseData.LinkTo(updateCsvImport)
updateCsvImport.LinkTo(completionBlock)
batchBlock.LinkTo(insertSensorDataBlock)
bufferBlock.Completion.ContinueWith(t => readCsvFile.Complete());
readCsvFile.Completion.ContinueWith(t => normaliseData.Complete());
normaliseData.Completion.ContinueWith(t => updateCsvImport.Complete());
updateCsvImport.Completion.ContinueWith(t => completionBlock.Complete());
batchBlock.Completion.ContinueWith(t => insertSensorDataBlock.Complete());
, 즉 좋은 패턴 또는 다르게 구성되어야 하는가? 내 문제는 모든 레코드를 밀어 넣은 후에 파일을 가져올 때만 표시 할 수 있다는 것입니다. 우리가 80
경우 밀어 무엇 100
의 배치가있는 경우
Task.WhenAll(bufferBlock.Completion, batchBlock.Completion).Wait();
, 마지막 80
을 배출하는 방법은 무엇입니까?
주 파이프 라인에 BatchBlock
을 연결해야하는지 확실하지 않았지만 둘 다 완료 될 때까지 기다립니다.모든