用于处理大数组的虚拟内存示例

本文关键字:虚拟内存 数组 处理 用于 | 更新日期: 2023-09-27 18:15:43

我对c++/c#和WinAPI很笨。有没有人能和我分享一些有用的链接,或者展示一些使用虚拟内存处理大数组的简单例子(c++或c#) ?

用于处理大数组的虚拟内存示例

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

看一下windows的MSDN或Linux的man mmap上的"创建文件视图"

虚拟内存不是编程语言的属性。您永远不能从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内存后,我用手杀死了它。再说一次,你从来没有"turn it on"。这是操作系统的一个基本功能,你的程序不能很容易地知道它使用了多少物理内存。

所以我希望我已经说服你从不同的角度看待虚拟内存。希望这能帮助你解决数组问题

我知道我在看这个问题,但是它没有选择答案。因为虚拟内存无处不在,你不能放弃使用它。然而,你可以更直接地控制它,查看c#内存页的msdn,或者你可以创建一个文件并将其用作缓冲区("fileview"),检查异常并离开,(在对象序列化的帮助下)

或者,在我看来更优雅的方式:不安全代码=)创建一个数组,该数组中的每个单元格都包含一个指向一个数组的ref,该数组包含大图数组的那个扇区。

(使用一点系统魔法,您可以为您的部分数组计算一个合适的大小->获得文件系统块的大小,这样就不会丢失空间。)如果您信任您的操作系统,您可以使用典型的2进制数作为大小。