草庐IT

mmap_alloc

全部标签

Linux:大型 int 数组:mmap 与查找文件?

假设我有一个数据集,它是一个1e1232位整数(4TB)的数组,存储在4TBHDDext4文件系统上的文件中。认为数据很可能是随机的(或至少看起来是随机的)。//pseudo-codefor(longlongi=0;i此外,考虑到我希望以不可预测的顺序读取单个int元素,并且该算法不确定地运行(它正在进行中)。//pseudo-codewhile(true)UseInt(GetFileInt(GetRand(1我们使用的是Linuxx86_64,gcc。您可以假设系统有4GB的RAM(即比数据集少1000倍)以下是架构师访问的两种方式:(A)将文件映射到一个4TB的内存块,并以int数

memory - windows平台上是否有内存映射api,就像linux上的mmap()一样?

有没有做内存映射的api,就像mmap()在Linux上? 最佳答案 取决于你到底想用它做什么。如果要将现有文件映射到内存中,memory-mappedfiles支持。.它们还可以用于在进程之间共享内存(使用没有基础文件的命名映射对象)。如果你想映射物理内存,用户模式一般不支持,虽然有一些技巧。 关于memory-windows平台上是否有内存映射api,就像linux上的mmap()一样?,我们在StackOverflow上找到一个类似的问题: https:

c++ - 为什么书上说 “the compiler allocates space for variables in memory” ?

为什么书上说“编译器为内存中的变量分配空间”。不是可执行文件吗?我的意思是,例如,如果我编写以下程序,#includeusingnamespacestd;intmain(){intfoo=0;cout并编译它,得到一个可执行文件(让它成为program.exe),现在,如果我运行program.exe,这个可执行文件将自己命令为变量foo分配一些空间。不会吗?请解释为什么书籍一直说,“编译器会做这个......做那个”,而实际上,编译的可执行文件会这样做。在这个问题上添加另一个相关问题,为什么sizeof称为编译时运算符?它实际上不是一个运行时运算符吗? 最

c++ - 提高 mmap memcpy 文件读取性能

我有一个从文件中顺序读取数据的应用程序。有些是直接从指向mmaped文件的指针读取的,而其他部分是从文件memcpyed到另一个缓冲区的。我注意到在我需要的所有内存(1MBblock)中执行较大的memcpy时性能很差,而在执行大量较小的memcpy调用时性能更好(在我的测试中,我使用了4KB的页面大小,运行了1/3的时间。)我认为问题是使用大型memcpy时出现大量重大页面错误。我尝试了各种调整参数(MAP_POPUATE、MADV_WILLNEED、MADV_SEQUENTIAL),但没有任何明显改善。我不确定为什么许多小的memcpy调用应该更快;这似乎违反直觉。有什么办法可以改

c++ - 弃用 std::allocator<void>

相关:Whydostandardcontainersrequireallocator_type::value_typetobetheelementtype?据说从C++17开始,以下内容已被弃用:templatestructallocator;我想知道它是否已被弃用,因为现在仅主模板就可以容纳allocator,或allocator的用例已弃用。如果是后者,我想知道为什么。我认为allocator在指定未绑定(bind)到特定类型的分配器时很有用(所以只是一些模式/元数据)。 最佳答案 根据p0174r0Similarly,std:

c++ - C++0x 中 allocator_traits<T> 的目的是什么?

为什么没有标准C++03接口(interface)用于查询C++0x中使用的分配器的成员类型?成员类型不足的用例有哪些? 最佳答案 为了从设计模式的角度解释allocator_traits,它是Adapter包装满足更少实现要求的自定义分配器(不需要构造,销毁,所有那些typedef...)并将其转换为FlyWeight使用静态成员和类型为您完成分配器实现要求的其余部分的对象。根据open-stddocScopedAllocatorModel的第3页,使用allocator_traits,您只需为自定义分配器提供至少10行代码。(感

c++ - 为什么 new[-1] 会产生 segfault,而 new[-2] 会抛出 bad_alloc?

我尝试通过将一些否定参数传递给new[]来测试bad_alloc异常。当传递小的负数时,我得到了我所希望的-bad_alloc。但是,当传递-1时,我可以看到我的对象被构​​造了数千次(我在构造函数中打印静态计数器)并且应用程序因段错误而终止。new[]将有符号整数转换为size_t,所以-1是size_t和-2是最大值-1以此类推。那么为什么new[]在接收到一个巨大的数字时会抛出异常,但在接收到size_t的最大值时会尝试分配呢?new[]的1111...1和1111...0有什么区别?:)提前致谢! 最佳答案 这是我的猜测:在

c++ - 捕获 std::bad_alloc 的策略

所以我在开发过程中经常使用Qt并且喜欢它。Qt对象的通常设计模式是使用new分配它们。几乎所有示例(尤其是Qt设计器生成的代码)都绝对不检查std::bad_alloc异常。由于分配的对象(通常是小部件等)很小,这几乎不是问题。毕竟,如果您未能分配20字节之类的内容,那么您可能无法解决问题。目前,我采用了将“大”(大小超过一页或两页的任何内容)分配包装在try/catch中的策略。如果失败,我会向用户显示一条消息,几乎任何更小的消息,我都会让应用程序崩溃并出现std::bad_alloc异常。那么,我想知道这方面的学派是什么?检查每个new操作是否是好的策略?还是只有我认为有可能失败的

c++ - SWIG 包装库中 __cxa_allocate_exception 期间的段错误

在为Ruby开发一个SWIG封装的C++库时,我们在C++代码内的异常处理过程中遇到了无法解释的崩溃。我不确定重新创建问题的具体情况,但它首先发生在调用std::uncaught_exception期间,然后在一些代码更改后,移至__cxa_allocate_exception在异常构造期间。GDB和valgrind都没有提供任何有关崩溃原因的见解。我找到了几个类似问题的引用资料,包括:http://wiki.fifengine.de/Segfault_in_cxa_allocate_exceptionhttp://forums.fifengine.de/index.php?topic

c++ - 当一个类在构造函数中动态分配自己时,为什么会发生堆栈溢出而不是 std::bad_alloc?

我创建了一个使用new递归创建自身的类(只是为了好玩!),预计由于无限动态分配(堆)这将抛出std::bad_alloc溢出)。但是发生堆栈溢出而不是std::bad_alloc。为什么会这样?classOverflow{private:Overflow*overflow;public:Overflow(){overflow=newOverflow();}};intmain(){Overflowoverflow_happens;//stackoverflowhappensinsteadofstd::bad_allocexeption}@Caleth询问如果我将newOverflow()