簡體   English   中英

使用元數據提取器提取 Exif 數據時性能下降

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM