首页 > 解决方案 > 散景烧瓶:烧瓶无法显示大型阵列,这是由于繁重的计算脚本进入散景,但在具有相同大小的阵列的轻型脚本中工作

问题描述

我正在使用烧瓶开发 Web 应用程序并使用散景来可视化结果。它将 tiff 文件读取为数组,然后用一些数学计算对其进行处理,然后将结果映射到颜色图并用散景显示,数组的大小为 7771x7631。当我尝试只使用总脚本的 1/8 时,它也导致了 7771x7631 的数组,它工作正常。但是当我尝试使用整个脚本非常繁重并且需要两分钟才能完全运行并且还导致数组 7771x7631 时,浏览器没有显示任何散景图。该脚本很好并且可以正常工作,因为当我尝试将结果数组切成一半大小(4000x4000)时它可以工作。我真的不知道为什么会发生这种情况。请帮我。

标签: flaskbokeh

解决方案


对于 Bokeh 中的图像图,这不是一个合理的大小。它远远超出了此类的预期/预期使用量(实际上甚至不接近)。我可以想象它可能无法在任何给定浏览器上运行的各种原因,从特定于浏览器的内存或画布大小限制、浏览器错误等开始。这种大小的 RGBA 数组只有近四分之一 GB,它必须作为 base64 编码的字符串(稍大)接收,然后将其转换为 JS 类型的数组。这两者必须同时存在,至少要足够长才能解码,这意味着浏览器堆栈必须同时在堆栈上容纳超过半 GB 的容量 [1]。许多浏览器根本不会。该项目对此无能为力。

如果你有这种大小的数据,你真的必须考虑某种下采样方法,将发送到浏览器的图像缩小到更易于管理的大小,同时也更接近实际绘图画布的像素尺寸。如果您将如此大的图像发送到较小的画布,那么浏览器将无论如何都会进行二次采样,只是为了适应画布上的东西。唯一的区别是在这种情况下您无法控制该过程。所以最好在如何完成下采样方面发挥积极作用。像Datashader这样可以很好地与 Bokeh 配合使用的工具可能会很有用。

[1] 如果这是一个 Bokeh 服务器应用程序,那么数据可以以原始二进制格式直接发送到类型化数组缓冲区中,这样可以避免大约一半的成本。它可能对一些人有所帮助,但我仍然认为这种用法非常极端。


推荐阅读