[英]Slow performance when extracting Exif data using metadata-extractor
我有一個相當簡單的任務——我需要從一組圖像中提取創建日期、最后修改日期和拍照日期,並將它們寫入文本文件。 對於拍照日期,我使用的是metadata-extractor 。
這是一些示例代碼,
List<FileInfo> fileList = Utils.FileList(targetPath, true);
foreach (FileInfo fi in fileList)
{
string dateTime = "";
try
{
var metadatadir = ImageMetadataReader.ReadMetadata(fi.FullName);
var subIfdDirectory = metadatadir.OfType<ExifSubIfdDirectory>().FirstOrDefault();
dateTime = subIfdDirectory?.GetDescription(ExifDirectoryBase.TagDateTimeOriginal);
}
catch (Exception e)
{
Console.WriteLine(e);
}
DateTime creationDate = File.GetCreationTime(fi.FullName);
DateTime modifiedDate = File.GetLastWriteTime(fi.FullName);
string outputLine = "Filename " + fi.Name + "\t Creation Time: " + creationDate +
"\t Modified Time: " + modifiedDate + "\t" + "Exif Time: " + dateTime + "\n";
File.AppendAllText(targetFile, outputLine);
fileCount++;
}
我在這個塊周圍包裹了一個Stopwatch
object 來測量性能,這是我得到的結果,
在 440218 毫秒內處理了 2244 個文件。
如果我注釋掉 Exif 代碼( try-catch
塊)我得到,
在 116928 毫秒內處理了 2244 個文件。
我是否錯誤地使用了圖書館? 有沒有更快的方法來提取數據?
編輯根據反饋,我已切換到使用StreamWriter
,如下所示,
using (StreamWriter tFile = File.AppendText(targetFile))
{
// Code
tFile.WriteLine(outputLine);
}
基於這個最新的變化,使用 Exif 代碼所花費的時間減少了一半,
在 212278 毫秒內處理了 2244 個文件。
根據Drew Noakes的以下評論,
在您的情況下,性能可能取決於 I/O。 現在,您使用的代碼提取了所有文件格式的所有元數據類型。 如果您只想要 JPEG 文件的一天 Exif,它可能會提高性能
與其在循環中調用
File.AppendAllText
,不如創建一個StreamWriter
並使用它,這樣您只需打開和關閉 output 文件一次,而不是每個輸入文件一次。 它也將允許更多的緩沖。
我確實做到了這一點,性能速度翻了一番,這對我的目的來說已經足夠了。 請參閱原始帖子中的編輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.