用于处理Big Arrays的虚拟内存示例

时间:2011-11-26 14:47:02

标签: c# c++ virtual-memory

我在C ++ / C#和WinAPI中愚蠢。有人可以与我分享有用的链接或显示使用虚拟内存的简单示例来处理大数组(在C ++或C#上)。

提前致谢。

3 个答案:

答案 0 :(得分:2)

我认为你所使用的是使用内存映射文件,它允许你使用文件的内容“好像”它被加载到内存中,而实际上它主要存在于磁盘上。

请查看"Creating a File View" on MSDN的Windows,或man mmap的Linux。

答案 1 :(得分:2)

虚拟内存不是您的编程语言的属性。您不能永远从C ++程序或C#程序中查看虚拟内存。在任何现代(< 20年)硬件或操作系统上,您都不能 ,而是能够直接控制它。

但你总是总是使用它。

在本地计算机上尝试以下程序:

#include <iostream>
int main(int, const char*[])
{
    const std::size_t one_megabyte = 1024 * 1024;
    char* gigantic_array[5*1024];   // 5GB in blocks of 1MB

    std::size_t counter = 0;
    while (true) {
        // Allocate and use the memory (prevents OS cheating)
        gigantic_array[counter] = new char[one_megabyte];
        for (std::size_t i = 0; i < one_megabyte; ++i)
             gigantic_array[counter][i] = 'F';

        ++counter;
        std::cout << "Allocated " << counter / 1024. << "GB of memory." << std::endl;
    }

    return 0;
}

在运行此程序之前,请在单独的shell中运行top。现在运行它。您将很快看到刚刚运行的程序竞争到列表的顶部。数字将滚动...

现在很快,你可能会注意到暂停。在我的笔记本电脑上,发生在1.3 GB,或多或少。在此暂停时,您的计算机上没有物理内存,虚拟内存开始将内容交换到磁盘。再一次,你不仅仅是打开虚拟内存,你只是通过实际让它从RAM中逐出来来使其工作变得更加困难。

现在等一下。你的机器有多少RAM?我这里有4GB。在分配了5.5GB的内存之后,我手动杀了程序。再一次,你永远不会“打开它”。这是操作系统的基本功能,您的程序无法轻易判断它正在使用多少物理内存。

所以我希望我已经说服你以不同的方式看待虚拟内存。希望这也可以帮助您解决您的大阵列问题。

答案 2 :(得分:0)

我知道我犯了这个问题,但它没有选择答案。 由于虚拟内存始终无处不在,因此您无法放弃使用它。 然而,您可以更直接地控制它,请参阅msdn for c#memorypages,或者您可以创建一个文件并将其用作缓冲区(&#34; fileview&#34;),检查异常并关闭,(借助于你的对象很少序列化)

或者,我认为更优雅的方式: 不安全的代码=) 创建一个数组,该数组中的每个单元格都包含一个数组,该数组包含大图像数组的扇区。

(有一点系统魔力,你可以为你的零件阵列计算一个好的尺寸 - &gt;获得文件系统的1块大小,这样就不会丢失任何空间。)如果你信任你的操作系统,你可以拿一个典型的2号基数。