Python 3.x 我怎样才能避免一个“错误”;分段故障(堆芯倾倒)“;使用PIL/OpenCV/Matplotlib加载大型.JP2图像时出错?

Python 3.x 我怎样才能避免一个“错误”;分段故障(堆芯倾倒)“;使用PIL/OpenCV/Matplotlib加载大型.JP2图像时出错?,python-3.x,matplotlib,segmentation-fault,jpeg2000,vips,Python 3.x,Matplotlib,Segmentation Fault,Jpeg2000,Vips,我在一个简短的脚本中运行以下简单的行,没有任何问题: Python 3.5.2; PIL 1.1.7; OpenCV 2.4.9.1; Matplotlib 3.0.1; ... # for example: img = plt.imread(i1) ... 但是,如果加载的.JP2的大小大于约500 MB,则Python3在尝试加载映像时会抛出以下错误: “分段故障(堆芯转储)” 这不应该是RAM问题,因为当错误发生时,只有约40%的可用RAM被使用,当RAM被移除或添加到计算机时,错误保

我在一个简短的脚本中运行以下简单的行,没有任何问题:

Python 3.5.2;
PIL 1.1.7;
OpenCV 2.4.9.1;
Matplotlib 3.0.1;

...
# for example:
img = plt.imread(i1)
...
但是,如果加载的.JP2的大小大于约500 MB,则Python3在尝试加载映像时会抛出以下错误:

“分段故障(堆芯转储)”

这不应该是RAM问题,因为当错误发生时,只有约40%的可用RAM被使用,当RAM被移除或添加到计算机时,错误保持不变。使用其他方式加载图像时,错误也保持不变,例如使用PIL

有没有办法避免这个错误或解决它?
非常感谢

这不是一个真正的解决方案,更多的是一个可能有效或帮助其他人想出类似或进一步发展的想法

如果您想对每个monster JP2图像执行多个操作或裁剪,那么您可能需要提前付出代价,只需一次就可以将其转换为ImageMagick随后可以更轻松地处理的格式。因此,您的图像是20048x80000个2字节的短片,因此您可以将其扩展为16位PGM文件,如下所示:

convert monster.jp2 -depth 16 image.pgm
这大约需要3分钟。但是,如果您现在想从图像高度向下提取部分图像,现在可以从PGM中提取:

convert image.pgm -crop 400x400+0+6000 tile.tif
在18秒内,而不是从怪物JP2:

convert monster.jp2 -crop 400x400+0+6000 tile.tif
这需要153秒



请注意,PGM将占用大量磁盘空间。。。。我想你也可以用TIFF做同样的尝试,它也可以保存16位数据,也可以进行LZW压缩。我想您也可以使用
libvips
更快地从PGM文件中提取磁贴。

这不是一个真正的解决方案,更多的是一个可以工作或帮助其他人想出类似或进一步开发的想法

如果您想对每个monster JP2图像执行多个操作或裁剪,那么您可能需要提前付出代价,只需一次就可以将其转换为ImageMagick随后可以更轻松地处理的格式。因此,您的图像是20048x80000个2字节的短片,因此您可以将其扩展为16位PGM文件,如下所示:

convert monster.jp2 -depth 16 image.pgm
这大约需要3分钟。但是,如果您现在想从图像高度向下提取部分图像,现在可以从PGM中提取:

convert image.pgm -crop 400x400+0+6000 tile.tif
在18秒内,而不是从怪物JP2:

convert monster.jp2 -crop 400x400+0+6000 tile.tif
这需要153秒




请注意,PGM将占用大量磁盘空间。。。。我想你也可以用TIFF做同样的尝试,它也可以保存16位数据,也可以进行LZW压缩。我想您也可以使用
libvips
更快地从PGM文件中提取磁贴。

您的意思是JP2文件的磁盘容量超过500MB吗?或者它在加载时扩展到超过500MB的内存?您是如何创建JP2的,或者您可以提供一个指向其来源的链接吗?JP2文件的尺寸(以像素宽×像素高为单位)是多少?你在使用什么操作系统?你好,马克,是的,磁盘上的.jp2大于500 MB。我没有创建.JP2文件,这些是我下载的大图像(~20000像素宽,~60000像素高,I;16,JPEG2000)。例如,从这里:图像的宽度总是相等(或多或少),但长度会有所不同(决定磁盘上文件的大小)。我的操作系统是Ubuntu 16.04。谢谢您链接的图像是20k x 80k,即1.6千兆像素,每个2字节,因此内存至少为3.2GB。那么,所有的库和你的操作系统最好是64位?如果你提供更多关于你打算如何处理图像的信息,我可能会有一些建议,但是作为第一次尝试,我建议你考虑用<代码> vip替换<代码>分割错误< /代码>标签,因为这似乎是目前最有可能的解决方案。添加了“贵宾”标签!我通常会执行一些小操作,如平铺图像或从16位转换为8位。。。我可以用pyvips这样做吗?你是说JP2文件在磁盘上超过500MB?或者它在加载时扩展到超过500MB的内存?您是如何创建JP2的,或者您可以提供一个指向其来源的链接吗?JP2文件的尺寸(以像素宽×像素高为单位)是多少?你在使用什么操作系统?你好,马克,是的,磁盘上的.jp2大于500 MB。我没有创建.JP2文件,这些是我下载的大图像(~20000像素宽,~60000像素高,I;16,JPEG2000)。例如,从这里:图像的宽度总是相等(或多或少),但长度会有所不同(决定磁盘上文件的大小)。我的操作系统是Ubuntu 16.04。谢谢您链接的图像是20k x 80k,即1.6千兆像素,每个2字节,因此内存至少为3.2GB。那么,所有的库和你的操作系统最好是64位?如果你提供更多关于你打算如何处理图像的信息,我可能会有一些建议,但是作为第一次尝试,我建议你考虑用<代码> vip替换<代码>分割错误< /代码>标签,因为这似乎是目前最有可能的解决方案。添加了“贵宾”标签!我通常会执行一些小操作,如平铺图像或从16位转换为8位。。。我可以用pyvips做些类似的事情吗?我也正打算提出这个建议,呵呵。如果你写一个平铺TIFF,libvips可以很快读取它,例如
convert PSP\u 007219\u 1720\u RED.NOMAP.JP2-define TIFF:tile geometry=128x128-compress jpeg x.tif
在这台笔记本电脑上需要2500万,需要6.5gb的ram。@jcupitt John,从平铺TIFF中提取一个400x400+0+6000块的等价物是什么?另外,您的
-compress JPEG
是否继承/保留原始图像的10比特?谢谢。嘿,马克,你可以用
crop
。我希望10位不重要,但如果是,是的,我想你需要使用16位LZW@上面的cgohlke说枕头可以用jp2支持来制作(我不知道!),所以这也许是最好的方法。@jcupitt,好主意的家伙们,让我看看我能不能让它们在我的机器上工作!我也打算提出这个建议,呵呵。如果你写了一篇平铺的TIFF