DICOM 태그를 다루던 중 태그 타입에 1C라고 적혀있는 걸 보고 문득 TagType의 정확한 정의가 궁금해져서 알아본 후 작성한 글입니다.

 

 

 

Data Element Type

 

 

DICOM에서 태그 타입 ‘1C’는 조건적으로 필수인 타입 1이지만 비어있거나 존재하지 않을 수 있는 타입 2가 포함된 데이터 요소입니다.

 

다른 말로 태그 타입 ‘1C’는 데이터 요소가 필수로 DICOM 객체에 나타나야 하지만 특정 환경이나 다른 연관된 태그의 값에 따라 값을 가지고 있지 않을 수 있는 태그 타입을 가리킵니다. 만약 연관된 데이터 요소가 특정 값을 갖는다면 ‘1C’ 데이터 요소는 반드시 값을 가져야 하지만 연관된 데이터 요소가 특정한 값을 갖지 않는 다면 ‘1C’ 데이터 요소는 값을 빈값으로 갖거나 태그가 없을 수 있습니다.

 

DICOM 표준에서는 세 개의 데이터 요소 타입을 정의하고 있습니다:

  • 타입 1: 값을 반드시 가져야 하는 필수 요소.
  • 타입 2: 다른 연관된 요소에 따라 값을 가질 수도 가지지 않을 수도 있는 조건적으로 필요한 요소
  • 타입 3: 값을 가질 수도 가지지 않을 수도 있는 선택적 요소.

 

'1C' 태그 타입은 유형 1과 유형 2의 조합으로, 특정 조건에서는 요소가 값을 가져야 하지만 다른 조건에서는 비어 있거나 존재하지 않을 수 있는 태그 타입입니다. DICOM 파일을 읽거나 쓸 때 '1C' 데이터 요소를 올바르게 처리하여 해당 요소에 대해 정의된 조건에 따라 데이터가 적절하게 해석되고 처리되도록 해야 합니다.

 

 

참조

https://dicom.nema.org/medical/dicom/current/output/chtml/part05/sect_7.4.html

https://dicom.nema.org/medical/dicom/current/output/chtml/part05/sect_7.4.2.html

https://dicom.nema.org/medical/dicom/current/output/chtml/part05/sect_7.4.3.html

https://dicom.nema.org/medical/dicom/current/output/chtml/part05/sect_7.4.5.html

 

 

 

 

반응형

 

 

 

DICOM 태그를 다루면서 종종 간과하는 사실 중 하나가 태그 값의 길이입니다.

 

DICOM 태그 값의 길이는 항상 짝수입니다. 

 

홀수 길이의 DICOM 태그 값에 대한 제한은 짝수 길이 값을 기반으로 하는 DICOM 데이터의 형식 및 구조 때문입니다. 

 

1. 길이가 짝수인 태그 값의 표준화를 통해 DICOM 데이터를 여러 시스템 및 소프트웨어 애플리케이션에서 효율적이고 일관되게 구문 분석하고 처리할 수 있습니다.

2. 모호하거나 호환되지 않는 데이터 형식으로 인해 발생할 수 있는 오류 및 상호 운용성 문제를 방지하는 데 도움이 됩니다.

3. 길이가 짝수인 태그 값을 사용하면 DICOM 데이터를 저장하고 전송하는 프로세스가 간소화됩니다.

4. 데이터를 고정 길이 필드로 보다 효율적으로 압축하고 컴퓨터에서 더 빠르게 처리할 수 있습니다.

 

따라서 이러한 제한은 DICOM내에서 데이터의 효율적이고 일관된 처리를 가능하게 하고 오류 및 상호 운용성 문제를 방지하는 데 도움이 됩니다.

 

 

 

 

 

반응형

 

A second operation was started on this context instance before a previous operation completed. 와 같은 문제가 발생했을 때 해결 방법에 대해 알아봅니다.

 

 

 

원인

 

A second operation was started on this context instance before a previous operation completed. This is usually caused by different threads concurrently using the same instance of DbContext. For more information on how to avoid threading issues with DbContext, see https://go.microsoft.com/fwlink/?linkid=2097913. 와 같은 Exception이 발생합니다.

 

찬찬히 설명을 보면 뭔가 멀티 스레딩 관련 오류인 것을 확인할 수 있습니다. 직접 MSDN 페이지에 들어가 보니 다음과 같은 설명이 쓰여있습니다.

 

Entity Framework Core는 동일한 DbContext 인스턴스에서 실행되는 여러 병렬 작업을 지원하지 않습니다. 여기에는 비동기 쿼리의 병렬 실행과 여러 스레드에서의 명시적 동시 사용이 모두 포함됩니다. 따라서 항상 await 비동기 호출을 즉시 수행하거나 병렬로 실행되는 작업에 대해 별도의 DbContext 인스턴스를 사용합니다.

비동기 메서드를 사용하면 EF Core는 비차단 방식으로 데이터베이스에 액세스 하는 작업을 시작할 수 있습니다. 그러나 호출자가 이러한 메서드 중 하나가 완료되는 것을 기다리지 않고 DbContext에 대해 다른 작업을 계속 수행하면 DbContext의 상태가 손상될 수 있습니다(가능성이 매우 높음).

 

결국 한 콘텍스트가 다른 비동기 호출에 의해 사용되면서 발생한 것으로 확인되었습니다.

 

 

 

수정

 

사실 저는 하나의 단일 콘텍스트를 통해 작업하려고 했기 때문에 DBContext를 AddSingleton으로 등록해 둔 상태였습니다.

 

            IHost host = Host.CreateDefaultBuilder(args)
                .ConfigureServices(services =>
                {
                    services.AddSingleton<DBManager>();
                })
                .Build();

 

위와 같은 설명에 따라 AddSingleton을 AddTransient로 교체해 간단하게 문제를 해결할 수 있었습니다.

 

            IHost host = Host.CreateDefaultBuilder(args)
                .ConfigureServices(services =>
                {
                    services.AddTransient<DBManager>();
                })
                .Build();

 

이제 콘텍스트를 호출하게 되면 호출마다 새로운 인스턴스가 생성되며 발생하던 문제는 해결됩니다.

 

 

 

 

 

반응형

+ Recent posts