2017-05-11 19 views
1

Matlabではblockprocを使用して32ビット浮動小数点データの1つのバンドだけを含む大きな(ジオ)TIFFファイル(10Gbのオーダー)を処理します。Matlab - 大きなtiffを書き込んでいる間にBlockproc/tifflibが失敗するFile

私の問題は、blockproc、またはより具体的なtifflibが、突然タイルの書き込みに失敗することです。これは、入力ファイル、ハードドライブ/ファイルの場所、または処理、Matlabのバージョン、さらにはOSなどの他のパラメータとは無関係です。

通常、常に同じ紀元前(Linuxでは#3372、Windows 10では#3176)です。

しかし、blockprocは、より小さいバージョンの大きなファイル(〜10Gbではなく〜4Gb)を使用すると実行されます。

これは私が(Debianの64ビット、Matlabの2014b)を取得エラーメッセージです:@haraldKsコメントへ

Warning: The following error was caught while executing 'images.internal.TileHandle' 
class destructor: 
Unable to write tile #3684. 
> In TileCache>TileCache.setTile at 71 
    In TiffAdapter>TiffAdapter.getTileHandle at 560 
    In TiffAdapter>TiffAdapter.writeRegion at 354 
    In blockproc>putBlock at 879 
    In blockproc>serialLoop at 459 
    In blockproc at 340 
    In removeEGM at 13 
Warning: The following error was caught while executing 'images.internal.TileHandle' 
class destructor: 
Unable to write tile #3685. 
> In TileCache>TileCache.setTile at 71 
    In TiffAdapter>TiffAdapter.getTileHandle at 560 
    In TiffAdapter>TiffAdapter.writeRegion at 354 
    In blockproc>putBlock at 879 
    In blockproc>serialLoop at 459 
    In blockproc at 340 
    In removeEGM at 13 
Warning: The following error was caught while executing 'images.internal.TileHandle' 
class destructor: 
Unable to write tile #3686. 
> In TileCache>TileCache.setTile at 71 
    In TiffAdapter>TiffAdapter.getTileHandle at 560 
    In TiffAdapter>TiffAdapter.writeRegion at 354 
    In blockproc>putBlock at 879 
    In blockproc>serialLoop at 459 
    In blockproc at 340 
    In removeEGM at 13 
Warning: The following error was caught while executing 'images.internal.TileHandle' 
class destructor: 
Unable to write tile #3687. 
> In TileCache>TileCache.setTile at 71 
    In TiffAdapter>TiffAdapter.getTileHandle at 560 
    In TiffAdapter>TiffAdapter.writeRegion at 354 
    In blockproc>putBlock at 879 
    In blockproc>serialLoop at 459 
    In blockproc at 340 
    In removeEGM at 13 
Error using tifflib 
Unable to write tile #3372. 

Error in Tiff/writeEncodedTile (line 1602) 
tifflib('writeEncodedTile',obj.FileID,tileNumber-1,varargin{:}); 

Error in images.internal.TiffAdapter/writeBlock (line 420) 
       obj.TiffObj.writeEncodedTile(blockId, block); 

Error in images.internal.TiffAdapter/writeRegion (line 377) 
         obj.writeBlock(blockId, data(ry - start(1) + 1, ... 

Error in blockproc>putBlock (line 879) 
dest.writeRegion(start_loc,... 

Error in blockproc/serialLoop (line 459) 
putBlock(options.Destination,row,col,output_block,output_size); 

Error in blockproc (line 340) 
    serialLoop(); 

Error in removeEGM (line 13) 
blockproc(in_dem, [3000, 3000], my_fun, 'Destination', out_dem); 
+0

"ビッグTIFFファイル"またはBigTIFFファイルを書き込もうとしていますか? TIFFファイル形式では、符号なし32ビットオフセットを使用するため、ファイルサイズが4GBでハード制限があります。一方、BigTIFFは64ビットのオフセットを使用し、さらに大きなファイルを処理できます。 MatlabのBigTIFF/TIFFライブラリの使用がサポートされていますか? – haraldK

答えて

0

おかげで、私は解決策を見つけた:

MATLABは、問題(関数imread(なしBigTiffsを読むことができます))、それらを書きますが、blockprocはBigTiffsを読むことしかできませんが、書きません。 https://blogs.mathworks.com/steve/2013/08/07/tiff-bigtiff-and-blockproc/

基本的に私が唯一の(32ビット浮動小数点、一つのチャンネルのみ、無圧縮など、私が持っているデータに合うようにTIFFタグをconcering行を変更:私はこの1つに基づいて自分のimageAdapterを書いた回避策として

。)そして、元のファイルからジオリファレンスをgdalで後で単純にコピーしました。

obj.TiffObject.setTag('ImageLength', obj.ImageSize(1)); 
obj.TiffObject.setTag('ImageWidth', obj.ImageSize(2)); 
obj.TiffObject.setTag('TileLength', obj.TileLength); 
obj.TiffObject.setTag('TileWidth',  obj.TileWidth); 
obj.TiffObject.setTag('Photometric', Tiff.Photometric.MinIsBlack); 
obj.TiffObject.setTag('BitsPerSample', 32); 
obj.TiffObject.setTag('SampleFormat', Tiff.SampleFormat.IEEEFP); 
obj.TiffObject.setTag('SamplesPerPixel', 1); 
obj.TiffObject.setTag('ResolutionUnit', Tiff.ResolutionUnit.Inch); 
obj.TiffObject.setTag('Orientation', 1); 
obj.TiffObject.setTag('Compression', Tiff.ResolutionUnit.None); 
obj.TiffObject.setTag('PlanarConfiguration', Tiff.PlanarConfiguration.Chunky); 
関連する問題