- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在加载约1000个文件,每个文件代表约300万个浮点数组。我需要将它们全部存储在内存中,因为我需要进行一些涉及它们全部的计算。
在下面的代码中,我详细介绍了内存分配和文件读取,因此可以分别观察它们的速度。我感到惊讶的是,发现内存分配花费的时间比文件读取要长得多。
std::vector<std::vector<float> * > v(matrix_count);
for(int i=0; i < matrix_count; i++) {
v[i] = new std::vector<float>(array_size);
}
for(int i=0; i < matrix_count; i++) {
std::ifstream is(files[i]);
is.read((char*) &((*v[i])[0]), size);
is.close();
}
最佳答案
Is there something I could do to speed up the memory allocation? I tried allocating one large vector instead, but that failed with bad_malloc -- I guess a 10GB vector isn't ok.
我主要想通过解决这一部分来做出回应:bad_alloc
异常易于被误解。它们不是“内存不足”的结果-它们是系统无法找到连续的未使用页面块的结果。如果您习惯于尝试分配大量的连续内存块,那么您可能拥有足够多的可用内存,并且仍然会得到一个bad_alloc
,这仅仅是因为系统找不到一组空闲的连续页面。您不一定通过“确保有足够的可用内存”来避免bad_alloc
,因为您可能已经看到,尝试分配仅10 GB的块时,超过100 GB的RAM仍然会使您容易受到攻击。避免它们的方法是在较小的块中分配内存,而不是分配一个史诗数组。在足够大的规模上,展开列表之类的结构可以开始在巨大的数组上提供良好的性能,并且获得bad_alloc
异常的可能性要低得多(呈指数形式),除非您确实确实耗尽了所有可用内存。实际上存在一个峰值,在该峰值处连续性和它提供的引用局部不再变得有用,并且实际上可能以足够大的大小(主要是由于分页而不是缓存)阻碍了内存性能。
对于您要处理的史诗规模输入,鉴于它的页面友好特性,您实际上可能会从std::deque
中获得更好的性能(这是双端队列真正可以发光的少数情况之一,不需要push_front
与vector
)。如果您不需要完美的连续性,可以尝试一下。
自然,最好是使用实际的探查器进行测量。它可以帮助我们深入研究实际问题,尽管鉴于您拥有“大量块”的种类,您可能在这里受到内存而不是磁盘IO的瓶颈可能并不完全令人震惊(令人惊讶,但也许并不令人震惊)。正在分配(磁盘IO速度很慢,但是如果您确实给系统施加压力,则内存堆分配有时可能会很昂贵)。这在很大程度上取决于系统的分配策略,但是如果您分配并存储这样的史诗级内存块,那么即使是平板分配器或伙伴分配器也可能会退回到一个慢得多的代码分支,并且分配甚至可能开始需要类似于搜索或更多访问的东西在那些极端情况下迁移到二级存储(在这里,我不确定分配这么多大块时到底是怎么回事,但是我已经“感觉到”并测量了这些瓶颈,但是在某种程度上我从来没有弄清楚过OS到底在做什么-上面的这段纯粹是推测。
这有点违反直觉,但分配大量较小的块通常可以提高性能。通常情况会使情况变得更糟,但是如果我们要谈论的是每个内存块300万个浮点数和类似的1000个内存块,则可能有助于开始分配页面友好的4k块。通常,预先在大块中预先分配内存并进行池化比较便宜,但是这种情况下的“大”更像是4 KB块,而不是10 GB块。std::deque
通常会为您执行此类操作,因此尝试查看是否有帮助可能是最快的方法。使用std::deque
,您应该能够为所有10 GB的内容制作一个,而不必将其拆分成较小的内容以避免bad_alloc
。它也没有某些引用的全部内容的零初始化开销,即使在最坏的情况下,它的push_backs
也都是固定时间的(不像std::vector
那样摊销固定时间),所以我会尝试使用实际上是std::deque
,而不是预先调整大小并使用push_back
。您可以一次读取一小块文件的内容(例如:使用4k字节缓冲区),而只需推回浮点数即可。无论如何都可以尝试。
无论如何,这些都是未经培训的猜测,没有代码和性能分析结果,但是这些是在测量后可以尝试的一些方法。
MMF也可能是此方案的理想解决方案。让操作系统处理访问文件内容所需的所有棘手细节。
关于c++ - 分配约10GB的 vector -如何加快速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33658908/
我需要将大约 25 台客户端设备连接到一台服务器设备(都将是 iOS,尽管 Android 会更好)。我知道这个问题有几种解决方案,我自己倾向于 MultipeerConnectivity,但同时存在
我正在考虑为 Android 开发鸟类目录。它将包含许多图片和音频文件,大约 400Mb。 我是从这个世界开始的,但经过一些阅读后,我没有找到太多关于此类应用程序的信息。我有以下问题: 1.- 我有哪
这可能很难解释几何形状,所以我会小心拼写。这在标准 compas 应用程序和 CLLocationManager 中的数据中可见。 1)纵向手持手机时,假设俯仰角为0° 2) 当相机向上指向天空时(例
我有一个相当大的字典,其中包含大约 4000 万个键,我天真地通过将 {key: value, key: value, ...} 写入文本文件来存储这些键。我没有考虑到我永远无法实际访问这些数据这一事
当我在 Oracle 中使用大于约 600 条记录的“INSERT ALL”查询时,为什么查询性能会急剧下降?你能教我吗? 我使用的是 Spring + Mybatis + Oracle 以下是我的查
我有一个要在每个页面上运行的脚本。要做到这一点非常简单,我只需设置 @include * 即可完成。它显示在每个页面上,由我在代码中分配给它的热键组合激活。它按预期工作,没有问题。 但是,我希望它也可
我正在开发一个 Android 移动应用程序,它具有按顺序向服务器上传文件的功能。 我想在编写客户端服务器通信代码时牢记一个标准。 由于要从移动设备上传的文件大小约为 2MB,我们需要将文件分成多个部
我正在尝试根据在每个数据框中找到的一列(称为“名称”)中的匹配值来连接两个数据框(df1 和 df2) .我已经尝试使用 R 的 inner_join 函数以及 Python 的 pandas mer
我正在寻找一种方法来存储带有时间戳的数据。 每个时间戳可能有 1 到 10 个数据字段。 我可以使用简单的数据解决方案或 SQL 将数据存储为 (time, key, value) 吗?这与我可以存储
我有一个播放流式音频数据的应用程序(如聊天客户端)。该工作流程包括三个简单的步骤: 首先发送文件头信息(采样率、每个样本的位数和 channel 数)。 根据上述参数初始化音频waveout设备。 音
我目前正在为我的大学做一个项目。任务是编写语音识别系统,该系统将在后台的手机上运行,等待几个命令(例如,调用 0 123 ...)。 这是一个 2 个月的项目,因此不必非常准确。可接受的噪音量可以
我想将一个大约 50GB 的大文本文件拆分成多个文件。文件中的数据是这样的-[x=0-9之间的任意整数] xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx
我的团队刚刚开始使用 Mercurial 和中央存储库。我们让 Hudson 构建了“默认”分支的尖端——这基本上是我们的主线。我们的旧 VCS 有一个 checkin 政策,即必须在 checkin
我正在为马尔可夫链蒙特卡罗反演程序实现数据收集。然而,MCMC 运行可能需要一周或更长时间才能完成!在运行开始时打开文件会更好吗: with h5py.File('my_data.hdf5', 'r+
我想读取视频文件并保存为二进制文件并再次写入视频文件。我用 180MB 视频进行了测试。我使用了 fread 函数,但它发生了段错误,因为视频的数组大小很小。 这些是我的问题: 我使用 160*102
我有一个小问题。我有一个包含大约 300 万个城市的表,我需要对其运行 like 查询。 问题是,完成查询大约需要 9 秒。有什么想法可以让它变得非常快吗? 查询是: SELECT * FROM `c
进程从信号处理程序中发送给自身的信号在大约 20 秒内无法传递,然后它被传递了。 可能的原因是什么? 我想知道一般可能的原因。 我正在查看的实际代码是 here 最佳答案 很可能,您正在从信号处理程序
我正在使用“aws-sdk:^2.576.0”和“amazon-qldb-driver-nodejs:0.1.0-preview.2”,并遵循 node-sdk's sample code for q
我有 2 个实体,A 和 B,它们具有多对多关系。 A 实体大约有 10,000 个对象,B 大约有 20 个对象。 基本上,A 对象可以与一个或多个 B 对象相关,并且 B 对象会跟踪它们连接到哪些
我成功创建并启动了这个容器: https://github.com/puckel/docker-airflow 通过运行: docker build --rm --build-arg AIRFLOW_
我是一名优秀的程序员,十分优秀!