【问题标题】:Batch Processing Large Number of Files - Store in Memory or Write to Disk First?批量处理大量文件 - 存储在内存中还是先写入磁盘?
【发布时间】:2011-06-08 20:46:39
【问题描述】:

我正在编写一个可以帮助我校准和堆叠图像的软件 - 这种技术通常用于天文学/天文摄影中,以减少噪音并消除光学问题,例如渐晕。我将开始更详细地解释:

校准包含 3 个文件 - 偏置、暗场和平场。从主图像中减去偏差和暗,然后将主图像除以平场。正如您可以想象的那样,所有这些操作都是逐像素的。所有这些都不是问题,我已经对其进行了编程,并且效果很好。我一次打开一张图像,校准它然后关闭它。一边走一边释放记忆。

但是,我还需要能够堆叠图像,即平均它们,或取中值。

我的问题是,我应该先校准每个图像,将其保存在临时目录中,然后逐行读取每个图像并平均结果吗?继续写下每个平均行。

或者

我是否应该将每张图像都保存在内存中(可能会变得非常大),校准原始像素,然后保存堆叠的图像?

在这种情况下最好的行动方案是什么?

像素数组在我操作它们时存储为(double*)rawPixels

【问题讨论】:

  • 尝试两种方案并评估结果,然后选择一个 :-) 如果遇到问题,请在此处发布代码...
  • 所有图像是否同时适合 1:物理内存 2:虚拟内存地址空间?你能只为这个应用程序耗尽所有内存吗?
  • @Frederik:你比我快一分钟;-)。另一个想法:让用户决定(例如,通过某种选项)他/她更喜欢快速解决方案还是节省内存的解决方案。
  • 您也可以采用混合方法:在内存中分配一些图像,在磁盘中分配一些图像。创建一个“图像缓冲区”:当它填满时,开始写入磁盘。使用缓冲区大小来查看哪个大小表现最好,或者让用户决定

标签: performance optimization batch-processing


【解决方案1】:

您还可以预先为平均/中值图像(结果)分配空间,并在迭代图像时计算它。在伪代码中:

Image average;
foreach( Image i in Images){
    Calibrate(i);
    UpdateAverage( average, i );
}

嗯,没那么简单,但你明白了

【讨论】:

    猜你喜欢
    • 2012-05-13
    • 2010-12-29
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多