【问题标题】:32bit matlab program, 64bit windows, how do I get 6GB of RAM?32 位 matlab 程序,64 位 windows,我如何获得 6GB 的 RAM?
【发布时间】:2009-12-30 19:34:11
【问题描述】:

我有一些只能在 32 位窗口上运行的 matlab 代码,但我需要至少 6 GB 的内存来运行它。在我的实验室中,唯一具有 6gb 内存的机器正在运行 64 位窗口,有什么方法可以在这里运行此代码吗? 我正在考虑模拟一个 32 位窗口并在其上运行它,这行得通吗?

【问题讨论】:

  • 嗯,你在 Matlab 中做什么需要 6gb 的 RAM?也许有更好的方法?
  • 恕我直言,当涉及到 6gb 内存时,甚至可以(谦虚地建议)建议将这些东西重写为 fortran 程序,如果这可能没有显着差异(考虑到 matlab 有一些它的语法有优势,但在尝试简单地将其翻译成前面提到的那样时就不那么有利了)。
  • 但是如果我们不知道问题的本质,这一切都是纯粹的猜测。我很确定仍然存在优化的地方,所以为了避免内存需要一点。
  • 另外,这个怎么属于 su 的?
  • 您能解释一下为什么该代码只能在 32 位 Windows 上运行吗? Matlab 旨在相对独立于平台。纯 M 代码应该只在 64 位 Matlab 中工作。你在使用 MEX 文件吗? ActiveX 控件还是特殊的 DLL?

标签: memory-management matlab winapi win64


【解决方案1】:

在 Windows 64 位上作为 32 位进程运行时,您的 32 位应用程序只能寻址 4 GB。为了处理更多内存,您需要一个 64 位应用程序。

【讨论】:

  • 实际上在 32 位非服务器 Windows 上,您只能访问大约 3.3GB。
  • 我知道,但是在 64 位 Windows 上,每个用户进程都会获得整个 4 GB 的可寻址空间。
  • 32位服务器也是这样。在flat address space 内存模型中,CPU 永远不能为单个进程提供超过 4G 的内存(这是现在每个现代操作系统都使用的)......尽管您可以通过 36 位分页扩展访问多达 16G 的内存,单个进程一次仍然只能访问 4G。 @Brian,即使它确实神奇地为您提供了 4G(我认为这在技术上是不可能的),仍然无法轻松访问 6G 内存
  • @earlz:不确定我是否关注你。魔法是什么时候出现的?我所说的只是 32 位用户进程能够在 64 位 Windows 上寻址 4 GB。 64 位用户进程可以访问更多。
  • @Mark:我说的不是 32 位 Windows,OP 也不是。标题显示 64 位 Windows 上的 32 位 Matlab。我只是在说明一个 32 位进程(如 Matlab)在 Windows 64 位上运行时将能够利用 4 GB 内存。不需要任何花哨的内存管理。这正是 Windows 64 位处理 32 位应用程序的方式。
【解决方案2】:

我最近一直致力于将我们的几个大型 Matlab 代码从 32 位 Windows XP 迁移到 64 位 Windows XP。与这里的一两个其他回答者不同,我认为如今 6GB 是完全合理的内存要求;我们在这里使用的最大的台式机有双四核处理器和 32GB RAM。我的一些科学家同事想要更多,但他们总是想要更多。

我会进一步建议不要尝试重写您的应用程序以使用更少的 RAM;那将朝着错误的方向前进。如果将代码移植到 64 位机器上,它会更便宜、更快并且产生的错误更少。对于那些主张重构以使用更少 RAM 的人,我想说 在不久的将来,您将在什么时候面对市场现实并认识到 64 位计算将继续存在并且 RAM 相当便宜,尤其是与开发人员的时间成本相比?

忘记在 32 位机器上尝试使用 6GB RAM;正如其他人告诉你的那样,Matlab 和 Windows 不会这样做。但是,正如其他人所说,Matlab 对位数漠不关心,因此适用于 32 位版本的纯 Matlab 代码将适用于同一版本的 64 位版本。如果您从较旧的 32 位版本迁移到较新的 64 位版本,您可能会发现一些 Matlab 函数已停用,但无论如何您在迁移到较新的 32 位版本时也会遇到同样的问题。

如果您的代码只能在 32 位 Windows 上运行,那么我怀疑您使用的是 MEX 文件。这些必须重新编译才能在 64 位机器上执行。同样,如果您在移植时在 Matlab 版本之间移动,请注意已停用的功能。根据我的经验,另一个主要问题是您可能对某些基本数据类型的大小做出错误假设。 Fortran 和 C 标准(没有 C++ 经验可言)实际上都没有指定默认 INTEGER(对于 Fortran)或 int(对于 C——我认为不是 C 程序员)的字节大小。指针大小可能也只是模糊地指定。这意味着您可能必须 (a) 更改代码中的大量变量声明或 (b) 使用编译器指令/标志来指定 INTEGERS、REALS、int 和可能其他的默认大小。 (b) 更容易,(a) 可能更适合未来的可维护性。

【讨论】:

  • 杰夫阿特伍德不久前在他的博客上也提出了同样的观点 - codinghorror.com/blog/archives/001198.html将会出现一个更好的重构时间,它只是决定那个临界点在哪里。
  • @Paolo:对我来说,引爆点取决于我能多快获得一台翻新机(已批准)。
  • “我认为现在 6GB 是一个完全合理的内存要求”。听到听到。我在一台 128 GB、16 核的机器上使用了 MATLAB(用于对大型科学数据集进行数据挖掘)。
【解决方案3】:

您无法从 32 位应用程序访问 6GB 的 RAM。这给你留下了两个选择:

要么优化代码以使用更少的 RAM,要么使 Matlab 程序与 64 位兼容。

对于第一个选项,stackoverflow 的优秀人员可以为您提供帮助。

对于第二个选项:我所知道的 Matlab 的任何部分都不是 32 位的 - 除非您有 32 位的 Matlab 版本。但是,如果您有有效的维护合同,您可以下载并安装 64 位版本的 Matlab。 如果您的代码调用了为 32 位 Windows 编译的 mex 函数,您可以尝试为 64 位 Windows 重新编译它们。

【讨论】:

  • 是的,你可以,只是不能一次全部。 CreateFileMapping/MapViewOfFile.
【解决方案4】:

64 位 Windows 可以正常运行 32 位 Windows 程序。但是 32 位程序将无法访问 6 Gb 或内存,所以我不确定这对您有帮助。

【讨论】:

    【解决方案5】:

    我很确定大多数 32 位 Windows 版本(如除了服务器版本之外的所有版本)默认情况下将单个进程限制为 2GB,通过更改设置限制为 3GB...尽管在技术上可以访问 16G在 32 位模式下来自 Pentium Pro(及更高版本)CPU 的 RAM,我认为除了 Windows Server 之外没有任何优势

    为了让您的 Matlab 程序利用它,您必须做一些有趣的多进程工作以在 3G 内存库之间手动分页

    【讨论】:

      【解决方案6】:

      您不能将 6 GB 与 32 位地址一起使用。 32 位地址只能包含来自

      的值
      0 to 0xffffffff (== 4294967295 == 4GB)
      

      这些地址被每个 32 位程序使用并且对于每个 32 位程序都是必不可少的,无论您是否明确使用指针。

      (虽然有一些非常奇特的例外 - 但这些并不适用于此)。

      【讨论】:

        猜你喜欢
        • 2012-10-26
        • 2021-08-04
        • 1970-01-01
        • 1970-01-01
        • 2014-05-16
        • 1970-01-01
        • 2011-03-11
        • 2012-08-04
        • 2011-07-06
        相关资源
        最近更新 更多