วิธีการบูรณาการโฟลเดอร์ของการศึกษา DICOM
การสอนนี้แสดงให้เห็นว่าวิธีการถอดไฟล์ DICOM หลายไฟล์จากโฟลเดอร์โดยใช้ C# เมื่อทํางานกับหลายร้อยหรือหลายพันไฟล์ภาพทางการแพทย์การประมวลผลชุดเป็นสิ่งสําคัญสําหรับประสิทธิภาพและความสม่ําเสมอ
ข้อดีของแบทช์ Anonymization
ประสิทธิภาพ:- การประมวลผลการศึกษาทั้งหมดหรือเอกสารในกระบวนการเดียว
ความสอดคล้อง:- ใช้กฎการอ้างอิงเดียวกันกับไฟล์ทั้งหมด
อัตโนมัต:- integer into อัตโนมัติการทํางานและท่อ
ข้อกําหนด: การเตรียมสิ่งแวดล้อม
- ติดตั้ง Visual Studio หรือ IDE .NET ที่เข้ากันได้ใด ๆ.
- สร้างโครงการการใช้งาน .NET 8 ใหม่
- ติดตั้ง Aspose.Medical จาก NuGet Package Manager
- เตรียมโฟลเดอร์ input ด้วยไฟล์ DICOM และสร้างโฟล์ output
คู่มือขั้นตอนสําหรับถอดไฟล์ DICOM Anonymize
ขั้นตอน 1: ติดตั้ง Aspose.Medical
เพิ่มห้องสมุด Aspose.Medical ไปยังโครงการของคุณโดยใช้ NuGet
Install-Package Aspose.Medicalขั้นตอนที่ 2: รวมพื้นที่ชื่อที่จําเป็น
เพิ่มอ้างอิงไปยังพื้นที่ชื่อที่ต้องการในรหัสของคุณ.
using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Anonymization;ขั้นตอนที่ 3: สร้างเส้นทางไดเรกทอรี
กําหนดเส้นทางของหน้าจดหมายป้อนและออกของคุณ
string inputDirectory = @"C:\DicomStudies\Input";
string outputDirectory = @"C:\DicomStudies\Anonymized";
// Ensure output directory exists
Directory.CreateDirectory(outputDirectory);ขั้นตอนที่ 4: รายการไฟล์ DICOM
รับไฟล์ DICOM ทั้งหมดจากไดเรกทอรีป้อนรวมถึงแผนที่ด้านล่าง
string[] dicomFiles = Directory.GetFiles(
inputDirectory,
"*.dcm",
SearchOption.AllDirectories
);
Console.WriteLine($"Found {dicomFiles.Length} DICOM files to process.");ขั้นตอน 5: สร้าง Anonymizer
สร้างตัวอย่าง Anonymizer กับโปรไฟล์ที่คุณต้องการ
Anonymizer anonymizer = new();
// Or with a custom profile:
// ConfidentialityProfile profile = ConfidentialityProfile.CreateDefault(
// ConfidentialityProfileOptions.BasicProfile
// );
// Anonymizer anonymizer = new(profile);ขั้นตอน 6: การประมวลผลแต่ละไฟล์
ล้อผ่านไฟล์แต่ละไฟล์ anonimizes และบันทึกไปยังไดเรกทอรีการส่งออก
int successCount = 0;
int failCount = 0;
foreach (string filePath in dicomFiles)
{
try
{
// Load DICOM file
DicomFile dcm = DicomFile.Open(filePath);
// Anonymize
DicomFile anonymizedDcm = anonymizer.Anonymize(dcm);
// Preserve relative directory structure
string relativePath = Path.GetRelativePath(inputDirectory, filePath);
string outputPath = Path.Combine(outputDirectory, relativePath);
// Ensure subdirectory exists
Directory.CreateDirectory(Path.GetDirectoryName(outputPath)!);
// Save anonymized file
anonymizedDcm.Save(outputPath);
successCount++;
Console.WriteLine($"✓ Processed: {relativePath}");
}
catch (Exception ex)
{
failCount++;
Console.WriteLine($"✗ Failed: {filePath} - {ex.Message}");
}
}
Console.WriteLine($"\nCompleted: {successCount} succeeded, {failCount} failed.");ตัวอย่างรหัสสมบูรณ์สําหรับแบทช์ Anonymization
นี่คือตัวอย่างที่สมบูรณ์แบบที่แสดงให้เห็นถึงการอัญมณีโดยการรายงานขั้นสูง:
using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Anonymization;
string inputDirectory = @"C:\DicomStudies\Input";
string outputDirectory = @"C:\DicomStudies\Anonymized";
// Ensure output directory exists
Directory.CreateDirectory(outputDirectory);
// Get all DICOM files
string[] dicomFiles = Directory.GetFiles(inputDirectory, "*.dcm", SearchOption.AllDirectories);
Console.WriteLine($"Found {dicomFiles.Length} DICOM files to process.\n");
// Create anonymizer
Anonymizer anonymizer = new();
int successCount = 0;
int failCount = 0;
int total = dicomFiles.Length;
foreach (string filePath in dicomFiles)
{
try
{
DicomFile dcm = DicomFile.Open(filePath);
DicomFile anonymizedDcm = anonymizer.Anonymize(dcm);
string relativePath = Path.GetRelativePath(inputDirectory, filePath);
string outputPath = Path.Combine(outputDirectory, relativePath);
Directory.CreateDirectory(Path.GetDirectoryName(outputPath)!);
anonymizedDcm.Save(outputPath);
successCount++;
// Progress reporting
double progress = (double)(successCount + failCount) / total * 100;
Console.WriteLine($"[{progress:F1}%] ✓ {relativePath}");
}
catch (Exception ex)
{
failCount++;
Console.WriteLine($"✗ Failed: {Path.GetFileName(filePath)} - {ex.Message}");
}
}
Console.WriteLine($"\n========================================");
Console.WriteLine($"Batch Anonymization Complete");
Console.WriteLine($"Succeeded: {successCount}");
Console.WriteLine($"Failed: {failCount}");
Console.WriteLine($"========================================");การประมวลผลร่วมกันเพื่อประสิทธิภาพที่ดีขึ้น
สําหรับชุดข้อมูลขนาดใหญ่ใช้การประมวลผลร่วมกันเพื่อใช้หลายแกน CPU:
using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Anonymization;
using System.Collections.Concurrent;
string inputDirectory = @"C:\DicomStudies\Input";
string outputDirectory = @"C:\DicomStudies\Anonymized";
Directory.CreateDirectory(outputDirectory);
string[] dicomFiles = Directory.GetFiles(inputDirectory, "*.dcm", SearchOption.AllDirectories);
Console.WriteLine($"Found {dicomFiles.Length} DICOM files to process.\n");
// Thread-safe counters
int successCount = 0;
int failCount = 0;
ConcurrentBag<string> failedFiles = new();
// Process in parallel
Parallel.ForEach(dicomFiles, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }, filePath =>
{
try
{
// Each thread gets its own anonymizer instance
Anonymizer anonymizer = new();
DicomFile dcm = DicomFile.Open(filePath);
DicomFile anonymizedDcm = anonymizer.Anonymize(dcm);
string relativePath = Path.GetRelativePath(inputDirectory, filePath);
string outputPath = Path.Combine(outputDirectory, relativePath);
lock (outputDirectory) // Ensure directory creation is thread-safe
{
Directory.CreateDirectory(Path.GetDirectoryName(outputPath)!);
}
anonymizedDcm.Save(outputPath);
Interlocked.Increment(ref successCount);
}
catch (Exception ex)
{
Interlocked.Increment(ref failCount);
failedFiles.Add($"{filePath}: {ex.Message}");
}
});
Console.WriteLine($"\nBatch Anonymization Complete");
Console.WriteLine($"Succeeded: {successCount}");
Console.WriteLine($"Failed: {failCount}");
if (failedFiles.Any())
{
Console.WriteLine($"\nFailed files:");
foreach (string failure in failedFiles)
{
Console.WriteLine($" - {failure}");
}
}รุ่นที่เพิ่มขึ้นพร้อมการเข้าสู่ระบบ
สําหรับสภาพแวดล้อมการผลิตนําเข้าสู่ระบบที่เหมาะสม:
using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Anonymization;
string inputDirectory = @"C:\DicomStudies\Input";
string outputDirectory = @"C:\DicomStudies\Anonymized";
string logFile = Path.Combine(outputDirectory, "anonymization_log.txt");
Directory.CreateDirectory(outputDirectory);
string[] dicomFiles = Directory.GetFiles(inputDirectory, "*.dcm", SearchOption.AllDirectories);
Anonymizer anonymizer = new();
List<string> logEntries = new();
logEntries.Add($"Anonymization started: {DateTime.Now}");
logEntries.Add($"Input directory: {inputDirectory}");
logEntries.Add($"Output directory: {outputDirectory}");
logEntries.Add($"Total files to process: {dicomFiles.Length}");
logEntries.Add("---");
int successCount = 0;
int failCount = 0;
foreach (string filePath in dicomFiles)
{
string relativePath = Path.GetRelativePath(inputDirectory, filePath);
try
{
DicomFile dcm = DicomFile.Open(filePath);
DicomFile anonymizedDcm = anonymizer.Anonymize(dcm);
string outputPath = Path.Combine(outputDirectory, relativePath);
Directory.CreateDirectory(Path.GetDirectoryName(outputPath)!);
anonymizedDcm.Save(outputPath);
successCount++;
logEntries.Add($"SUCCESS: {relativePath}");
}
catch (Exception ex)
{
failCount++;
logEntries.Add($"FAILED: {relativePath} - {ex.Message}");
}
}
logEntries.Add("---");
logEntries.Add($"Anonymization completed: {DateTime.Now}");
logEntries.Add($"Succeeded: {successCount}");
logEntries.Add($"Failed: {failCount}");
// Write log file
File.WriteAllLines(logFile, logEntries);
Console.WriteLine($"Processing complete. Log saved to: {logFile}");การปฏิบัติที่ดีที่สุดสําหรับการประมวลผลแบทช์
- ** Run on Copy of Data**: เสมอประมวลผลสําเนาของข้อมูลเดิมของคุณไม่ใช่เอกสารเดิมเอง
- บันทึกการดําเนินงานทั้งหมด: บันทึกรายละเอียดของไฟล์ที่ได้รับการประมวลผลและข้อผิดพลาดใด ๆ ที่พบ
- ทดสอบครั้งแรก: ใช้ตัวอย่างขนาดเล็กก่อนการประมวลผลชุดข้อมูลทั้งหมด
- Monitor Disk Space: ให้พื้นที่ดิสก์เพียงพอสําหรับไฟล์ออก
- การหยุดการซื้อขาย: โปรดพิจารณาการนําไปใช้ฟังก์ชั่นการตรวจสอบจุด / resume สําหรับชุดขนาดใหญ่มาก
Troubleshooting
ปัญหาหน่วยความจํากับชุดข้อมูลขนาดใหญ่
สําหรับไฟล์ขนาดใหญ่มากหรือชุดข้อมูลการประมวลผลไฟล์หนึ่งในครั้งเดียวโดยไม่ต้องเก็บคําแนะนํา:
foreach (string filePath in dicomFiles)
{
using (DicomFile dcm = DicomFile.Open(filePath))
{
DicomFile anonymizedDcm = anonymizer.Anonymize(dcm);
anonymizedDcm.Save(outputPath);
}
// Files are disposed after each iteration
}ข้อผิดพลาดการอนุญาต
ตรวจสอบให้แน่ใจว่าแอพลิเคชันของคุณได้อ่านเข้าสู่ไดเรกทอรีป้อนและเขียนเข้าถึงไดรฟ์ส่งออก
ข้อสรุป
การฝึกอบรมนี้ได้แสดงให้เห็นถึงวิธีการถอดไฟล์ DICOM ใน C# โดยใช้ Aspose.Medical ไม่ว่าการประมวลผลหลายร้อยหรือหลายพันไฟล์วิธีถัดจะให้มั่นใจได้ว่ามีการระบุชื่ออย่างต่อเนื่องทั่วทั้งชุดข้อมูลของคุณในขณะที่ให้การติดตามขั้นตอนและการจัดการข้อผิดพลาดเพื่อความน่าเชื่อถือในการผลิต