DICOM अध्ययनों के एक फ़ोल्डर को कैसे बैच करें
यह ट्यूटोरियल दिखाता है कि C# का उपयोग करके एक फ़ोल्डर से कई DICOM फ़ाइलों को अनाम करने के लिए कैसे बैच करें. सैकड़ों या हजारों चिकित्सा छवियों के साथ काम करते समय, पैच प्रसंस्करण दक्षता और स्थिरता के लिये आवश्यक है.
Batch Anonymization के फायदे
प्रभावी ढंग स:- पूरे अध्ययन या संग्रह को एक ही ऑपरेशन में संसाधित करें।
संतुलन:- सभी फ़ाइलों पर एक ही एनीमेशन नियम लागू करें।
ऑटोमोबाइल:- स्वचालित कार्यप्रवाह और पाइपलाइन में एकीकृत करें।
आवश्यकताएँ: पर्यावरण को तैयार करन
- Visual Studio या किसी भी संगत .NET IDE सेट कर.
- एक नया .NET 8 एप्लिकेशन प्रोजेक्ट बनाएं।
- NuGet Package Manager से Aspose.Medical स्थापित करें।
- DICOM फ़ाइलों के साथ इनपुट फ़ोल्डर तैयार करें और एक आउटडोर फ़ॉल्टर बनाएं।
चरण-दर-चरण गाइड Batch Anonymize DICOM फ़ाइलों के लिए
चरण 1: Aspose.Medical स्थापित करें
NuGet का उपयोग करके अपने परियोजना में Aspose.Medical लाइब्रेरी जोड़ें।
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: प्रत्येक फ़ाइल को संसाधित करें
प्रत्येक फ़ाइल के माध्यम से जाओ, इसे अननाम करें, और आउटपुट निर्देशिका में सहेजें।
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.");Batch 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($"========================================");बेहतर प्रदर्शन के लिए समानांतर प्रसंस्करण
बड़े डेटासेट के लिए, कई सीपीयू कोरों का लाभ उठाने में समानांतर प्रसंस्करण का उपयोग करें:
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}");बैच प्रसंस्करण के लिए सर्वश्रेष्ठ अभ्यास
- Data Copy पर Run: हमेशा आपके मूल डेटा का एक प्रति संसाधित करें, न कि मूल स्वयं।
- ** लॉग सभी ऑपरेशन**: जिन फ़ाइलों को संसाधित किया गया था और किसी भी त्रुटियों का पता लगाने के लिए विस्तृत रिकॉर्ड रखें।
- प्रथम परीक्षण: पूरे डेटासेट को संसाधित करने से पहले एक छोटे से नमूना पर चलाएं।
- Monitor Disk Space: आउटपुट फ़ाइलों के लिए पर्याप्त डिस्क स्थान सुनिश्चित करें।
- Handle Interruptions: बहुत बड़े बैच के लिए चेकपॉइंट / रिज़्म कार्यक्षमता को लागू करने पर विचार करें।
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
}अनुमति गलतियां
सुनिश्चित करें कि आपके एप्लिकेशन ने इनपुट निर्देशिका तक पहुंच पढ़ी है और आउटडोर ड्राइव में प्रवेश लिख दिया है।
Conclusion
यह ट्यूटोरियल दिखाया गया है कि कैसे बैच एनीमेशन डीसीओएम फ़ाइलों में सी # का उपयोग करने के लिए Aspose.Medical. चाहे सैकड़ों या हजारों फाइलें को संसाधित करते हैं, पैच दृष्टिकोण आपके पूरे डेटासेट के माध्यम से एक निरंतर अनन्यता सुनिश्चित करता है, जबकि प्रगति ट्रैकिंग और उत्पादन विश्वसनीयता के त्रुटियों के प्रबंधन की आपूर्ति।