Низкая производительность при извлечении данных Exif с использованием metadata-extractor - PullRequest
0 голосов
/ 16 апреля 2020

У меня довольно простая задача - из коллекции изображений мне нужно извлечь дату создания, дату последнего изменения и дату создания изображения и записать их в текстовый файл. В качестве даты съемки изображения я использую экстрактор метаданных .

. Это пример кода:

    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 вокруг этого блока. чтобы измерить производительность, и вот результат, который я получаю,

Обработано 2244 файла за 440218 мс.

Если я закомментирую код Exif (блок try-catch), я get,

Обработано 2244 файла за 116928 мс.

Я неправильно использую библиотеку? Есть ли более быстрый способ извлечения данных?

РЕДАКТИРОВАТЬ На основе обратной связи я перешел на использование StreamWriter, как показано ниже,

using (StreamWriter tFile = File.AppendText(targetFile))
{
    // Code
    tFile.WriteLine(outputLine);
}

На основании этого последнее изменение времени было сокращено вдвое с помощью кода Exif,

Обработано 2244 файла за 212278 мс.

1 Ответ

0 голосов
/ 19 апреля 2020

На основании следующих комментариев от Дрю Ноакса ,

Производительность в вашем случае, скорее всего, снизится до ввода-вывода. Теперь используемый вами код извлекает все типы метаданных для всех форматов файлов. Если вам нужен только день, Exif для файлов JPEG, можно улучшить производительность

Вместо вызова File.AppendAllText в l oop, создайте StreamWriter и тратите на это, так что вы открывайте и закрывайте выходной файл только один раз, а не один раз для каждого входного файла. Это также позволит увеличить буферизацию.

Я сделал именно это, и скорость работы удвоилась, что достаточно для моих целей. См редактировать в оригинальном сообщении.

...