【问题标题】:ways to decrease memory usage and optimize your code in matlab在 matlab 中减少内存使用和优化代码的方法
【发布时间】:2025-11-26 12:10:01
【问题描述】:

我在具有 4 GB 物理 RAM 的 Windows 7x64 系统上运行此代码:

fileID1 = fopen ('D:\A\B\T3\T11.bin','r');
A1 = fread(fileID1);
fclose(fileID1);
fileID2 = fopen ('D:\A\B\T3\T12_real.bin','r');
A2 = fread(fileID2);
fclose(fileID2);
fileID3 = fopen ('D:\A\B\T3\T12_imag.bin','r');
A3 = fread(fileID3);
fclose(fileID3);
fileID4 = fopen ('D:\A\B\T3\T13_real.bin','r');
A4 = fread(fileID4);
fclose(fileID4);
fileID5 = fopen ('D:\A\B\T3\T13_imag.bin','r');
A5 = fread(fileID5);
fclose(fileID5);
fileID6 = fopen ('D:\A\B\T3\T22.bin','r');
A6 = fread(fileID6);
fclose(fileID6);
fileID7 = fopen ('D:\A\B\T3\T23_real.bin','r');
A7 = fread(fileID7);
fclose(fileID7);
fileID8 = fopen ('D:\A\B\T3\T23_imag.bin','r');
A8 = fread(fileID8);
fclose(fileID8);
fileID9 = fopen ('D:\A\B\T3\T33.bin','r');
A9 = fread(fileID9);

问题是遇到错误:

Error using fread
Out of memory. Type HELP MEMORY for your options.

Error in freeman2coponent (line 24)
A4 = fread(fileID4);

我试图打开的九个文件中的每一个都是一个大小为 159 MB 的文件,它有 162875472x1 个双元素。而且我需要同时在所有九个文件中的一个像素及其邻居的值来进行我的计算。 有没有一种有效的方法来做到这一点?我希望我的代码不会占用太多时间和内存 我用二进制查看器打开了一个文件,这些是文件的内容:

【问题讨论】:

  • 你能把像素值转换成 uint8 吗?这可能会节省一些内存。另外,查看 matfile(),它允许您仅在需要时加载部分变量(但可能有点慢)。
  • @adalca 完全正确,实际上通过转换为 uint8 可以节省大量内存——毕竟 159 MB 的文件占用了 1243 MB 的内存。内存映射也是一个好主意,但在这种情况下,您需要的不是matfile,而是memmapfile
  • 对 memmapfile 的良好调用 - 我没有使用太多,所以首先想到的是 matfile。

标签: performance matlab memory-management


【解决方案1】:

如果将所有值转换为 uint8,请务必在进行任何计算之前将其转换回 double。

matlab没有提升,所以如果uint8s取a的总和,会在256饱和,如果取多个整数的均值,就不会得到分数。

更好的方法可能是只加载文件的一小块,然后逐块读取 blcok

【讨论】:

  • 我不明白这是如何回答这个问题的。问题的上下文表明数据已经是图像,因此无需回溯到double。结果计算本身可以是double,但不需要将图像保留为double
  • @user3528438 我可以使用嵌套循环和 fseek 每次都读取文件块,但这会大大降低代码速度!