2015-10-27 3 views
2

Я пытаюсь написать стопки изображений в файлы TIFF. Изображения имеют размер 256 * 256 пикселей, каждый стек содержит 1000 изображений. Запись одного из этих файлов занимает около 4 минут - так что, скорее всего, что-то не так с моим кодом.Ускорить запись нескольких изображений TIFF?

Вот что я делаю:

void Tiff_WriterSplit(float data[], int PicNum, int WIDTH, int LENGTH, char PATH[]) { 
    int i; 
    int rows = LENGTH, columns = WIDTH; 
    TIFF* tif; 

    if (PicNum == 0) 
     tif = TIFFOpen(PATH, "w"); 
    else 
     tif = TIFFOpen(PATH, "a"); 

    TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, columns); 
    TIFFSetField(tif, TIFFTAG_IMAGELENGTH, rows); 
    TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1); 
    TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 32); 
    TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP); 

    for (i = 0; i < rows; i++) 
     TIFFWriteScanline(tif, &data[i * columns], i, 0); 

    TIFFWriteDirectory(tif); 
    TIFFClose(tif); 
} 

Эта функция Tiff_WriterSplit будет вызываться для каждого изображения в стеке. Первое изображение будет иметь PicNum = 0, чтобы открыть файл tiff в режиме w, все следующие изображения будут иметь PicNum > 0, чтобы открыть его в режиме a. Запись начинается со скоростью около 40 МБ/с и замедляется и замедляется с увеличением размера файла - примерно до 1 МБ/с. Как я могу оптимизировать производительность?

+1

На каком устройстве вы пишете? –

+0

Я запускаю это на определенной «рабочей лошади», которая берет данные с сервера (через 10 Gbit ethernet) и записывает их обратно на сервер. Я также записываю необработанные данные в двоичном формате на сервер со скоростью ~ 100 МБ/с. Итак, аппаратное обеспечение не должно быть проблемой здесь ... – Dominic

+0

@thomas Спасибо за предложение! Это действительно проблема с сервером - хранение файлов локально занимает <1 с на файл. Я попытаюсь сохранить их локально и затем скопировать их на сервер, чтобы избежать написания этих крошечных фрагментов по сети. – Dominic

ответ

0

Я столкнулся с подобными проблемами с производительностью. Похоже, что (с версии libTiff версии 4.0.9) в TIFFWriteDirectory возникает проблема производительности, которая заставляет его время выполнения масштабироваться с количеством изображений, уже присутствующих в многостраничном файле TIFF.

Я не думаю, что это связано с тем, как написана спецификация файла TIFF - я думаю, что это ошибка производительности в libTiff.

Я нахожу, что для сохранения моих первых 80 изображений (порядка 24 000 байт) требуется 21 мс, но это будет линейно возрастать до 3 секунд к тому времени, когда я написал 9000 изображений в один и тот же файл. 99,5% времени тратится в TIFFWriteDirectory (вызов в TIFFLinkDirectory, причем большая часть времени, проведенного в _tiffReadProc).