2012-04-28 5 views
3

Есть ли у кого-нибудь опыт работы с различиями в IO файла на разных платформах? Я написал программу LWJGL, которая транслирует файл TIFF со 100 МБ. Потоковая передача происходит довольно быстро на нескольких компьютерах Mac и Linux, но на моем 64-битном Windows 7 Desktop для загрузки каждой плитки карты требуется несколько секунд.Java очень медленно читает файлы на Windows

В принципе, я создаю 2D-массив экземпляров класса Tile. Каждый фрагмент представляет собой область размером 512x512 МБ файла TIFF, и метод визуализации проверяет, был ли загружен регион области памяти в памяти, если нет, загрузка помещается в очередь в ThreadPoolExecutor, если она не была поставлена ​​в очередь, ничего не происходит, если она загружена, это нарисован. Доступ к TIFF обрабатывается классом TIFF, который считывает файл с экземпляром RandomAccessFile. Это функция я использую для чтения фрагментов из TIFF

public BufferedImage getRasterTile(Rectangle area) { 
    BufferedImage image = new BufferedImage(area.width, area.height, 
      BufferedImage.TYPE_INT_RGB); 
    try { 
     long[] bytesPerSample = new long[bitsPerSample.length]; 
     for (int i = 0; i < bytesPerSample.length; i++) { 
      bytesPerSample[i] += bitsPerSample[i]/8 + bitsPerSample[i] 
        % 8 == 0 ? 0 : 1; 
     } 
     long bytesPerPixel = 0; 
     for (long bits : bitsPerSample) { 
      bytesPerPixel += bits/8 + bits % 8 == 0 ? 0 : 1; 
     } 
     long bytesPerRow = bytesPerPixel * imageWidth; 
     int strip, color; 
     byte red, green, blue; 
     for (int i = area.x; i < area.x + area.width; i++) { 
      for (int u = area.y; u < area.y + area.height; u++) { 
       if (i > 0 && u > 0 && i < imageWidth && u < imageLength) { 
        switch (planarConfiguration) { 
        case Chunky: 
         strip = (int) (u/rowsPerStrip); 
         seek(stripOffsets[strip] 
           + (u - strip * rowsPerStrip) 
           * bytesPerRow + i * bytesPerPixel); 
         red = readByte(); 
         green = readByte(); 
         blue = readByte(); 

         color = (red & 0x0ff) << 16 | (green & 0x0ff) << 8 
           | (blue & 0x0ff); 
         image.setRGB(i - area.x, u - area.y, color); 
         break; 
        case Planar: 
         strip = (u/(int) rowsPerStrip); 
         seek(stripOffsets[strip] + i); 
         red = readByte(); 
         seek(stripOffsets[strip + (int) imageLength] + i); 
         green = readByte(); 
         seek(stripOffsets[strip + 2 * (int) imageLength] 
           + i); 
         blue = readByte(); 
         color = (red & 0x0ff) << 16 | (green & 0x0ff) << 8 
           | (blue & 0x0ff); 
         image.setRGB(i - area.x, u - area.y, color); 
         break; 
        } 
       } else { 
        image.setRGB(i - area.x, u - area.y, 0); 
       } 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 
    return image; 
} 
+0

Я в замешательстве, вы говорите, что чтение идет медленно (в этом случае вы можете показать нам, как вы просто читаете данные), или преобразование происходит медленно. –

ответ

0

Я подозреваю, что это связано с тем, как вы читаете файл. Я замечаю, что вы неоднократно вызываете методы с именем readByte() и seek. Если эти методы совершают вызовы на небуферизованный поток (или экземпляр RandomAccessFile), то вы, вероятно, делаете огромное количество системных вызовов, и это сделает ваш метод очень медленным.

Если это причина, то, вероятно, вы должны прочитать весь файл изображения в файле byte[] и использовать индексирование массива, чтобы выловить нужные вам байты. Если файл изображения слишком велик, чтобы сделать это, вам нужно будет перестроить свой код, чтобы уменьшить поиск и чтение нескольких байтов за раз.

Смежные вопросы