问题标签 [memory-optimization]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 优化写入内存
我正在研究一种排序算法,它遍历一堆整数并将它们放入桶中。
桶的确切类型是类似于 的自定义数据结构std::vector
。正如您可以想象的那样,有一个类似于这个的片段,对于存储桶中已经分配了足够的内存来写入我要添加的元素的情况:
我在 vtune 优化器中发现 LINE 1 约占我算法运行时间的 1/3。我很好奇我是否可以做得更好,所以我开始尝试一些东西。
我的工作站是 Linux,我通常用 gcc 编译。我们的软件也必须支持其他编译器和系统,但仅 Linux 的优化被认为是可以的,因为我们“建议”用户使用 Linux。
首先,我只是在调用上述代码段的循环中添加了一个前瞻。展望未来buffer_size
的迭代,它得到了以下结果:
并将这些结果存储在类似于以下内容的缓冲区中buffer
:
我会运行相当于:
这消除了我在 vtune 第 2 行看到的瓶颈,但算法总体上较慢。(我尝试了 4 和 8 作为buffer_size
)。
我尝试了其他一些东西。特别是,我做了一些非常复杂的事情,我一次完全批处理 4 或 8 个整数,并且一次对所有整数执行每一步。我编写了代码来尝试查看是否需要重新分配;如果没有,我巧妙地编写了一些循环,避免了循环步骤之间的任何数据依赖性。当然,所有这些复杂性都可以预见地使算法变得更慢。:)
有可能它根本无法变得更快,但我直觉上应该有一些方法可以利用在循环结束之前第 2 行的写入没有数据依赖性,因此无需等待可能的缓存未命中有待解决。
我的理解是缓存未命中的延迟非常高,但我有点想知道为什么 CPU 不能继续运行并将写入留在缓冲区中以异步处理。
如果有一种方法可以保证在调用一些同步函数来提交到目前为止的所有写入之前我不会读取该内存,那将是非常酷的。
你认为事实上我正在填满写缓冲区吗?(在这种情况下没有解决方案?)
如果没有,有没有人知道有什么方法可以利用在热循环之后才会读取写入的事实?
redis - volatile-lru 是否会驱逐所有具有相同 ttl 的键?
我有数以千计的相关键设置相同的 ttl。
达到 maxmemory 后,volatile-lru 是否会驱逐共享相同 ttl 的所有密钥,或者只是为新数据腾出空间所需的密钥?
fortran - 有没有一种简单的方法来重构或编译用于行主要存储的 Fortran 代码?
我有一些非常古老的遗留 Fortran 代码,我正在尝试加速它们。一个主要的性能问题是,它使用了非常多、非常大的 3-D 数组,存储为 (Y,Z,X) 并且各个 (Z,X) 层必须通过网络进行通信。
这需要我在发送之前遍历数组并缓冲它们,因为 Fortran 使用列主要格式。有没有一种简单的方法,比如编译器标志或重构工具,让我的 (Z,X) 层位于连续内存中或将 Fortran 交换为行优先数组顺序?
java - 有没有像 Iterator 这样的东西,但有像 Streams 这样的功能?
所以基本上我想做的是以下几点:
- 从数据库中加载一批数据
- 将该数据(查询结果)映射
Object[]
到以可读格式表示数据的类 - 写入文件
- 重复直到查询没有更多结果
我列出了我熟悉的似乎符合需求的结构,以及为什么它们不符合我的需求。
- 迭代器 → 不调用就没有映射和过滤的选项
next()
- 我需要在子类中定义映射函数,但实际上没有数据(类似于流),这样我就可以将“流”方式传递给调用类,并且只有 call
next
,然后调用所有映射函数因此
- 我需要在子类中定义映射函数,但实际上没有数据(类似于流),这样我就可以将“流”方式传递给调用类,并且只有 call
- 流 → 在映射和过滤可能之前,所有数据都需要可用
- 可观察的→一旦数据可用就发送数据。我需要同步处理它
为了更多地了解我正在尝试做的事情,我做了一个小例子:
到目前为止我得到了什么:
我试图从 Iterator 的基础出发,因为它是唯一真正满足我的内存需求的。然后我添加了一些方法来映射和循环数据。虽然它并不是一个真正强大的设计,而且它会比我想象的更难,所以我想知道是否已经有任何东西可以满足我的需要。
到目前为止,这是可行的,但是有一些unchecked
我不太喜欢的任务,而且我希望能够将一个 QIterator “附加”到另一个 QIterator 本身并不难,但它也应该采用后面的地图附加。
c++ - 为什么这个程序占用太多内存?
我正在解决高中编程竞赛中的一项任务。这是一个简短的描述:
我们有一个高度为 h 和宽度为 w 的网格。网格中填充了字符“#”和“.”。Octothorps 代表土地,圆点代表水。保证网格的第一行和最后一行和最后一列都是点。相连的章鱼形成可以有湖泊的岛屿,每个湖泊也可以有岛屿,这些岛屿可以有湖泊等等......每个岛屿都有一个度数,定义为必须跨越的湖泊数量才能到达它如果一个人从网格边缘的水开始(这种水被视为海洋,不包括在到达岛屿必须穿过的湖泊数量之外)。在岛屿中找到最大度数。
我在学校服务器上运行我的程序,我收到了超出内存限制的错误,因为该程序据称占用了超过 300 MiB 的内存。这是程序:
h 和 w 的取值范围是 3 到 3000。为什么这个程序会占用这么多内存?它可能与递归函数有关吗?如何改进我的内存管理?
python - python脚本减慢数据加载到数据库
嗨,我正在尝试使用 python cur.execute(query,(data list)) 中的插入 sql 脚本将数据加载到数据库(mysql 和 sqlserver),在插入 100 mb 的数据量后,加载过程会减慢每条记录 7 分钟大约 100mb 数据后。我在 linux redhat 8 中运行 python 代码。如何优化它,使其与前 100 mb 数据运行相同
环境:linux 内存:8 gb 实例类型:t2 中等 python 3.8
arrays - 将本地动态数组的长度设置为零会减少内存使用吗?
将本地动态数组的长度设置为零(不再需要时)是否具有内存使用优势?
例如:
c - strcpy 一个静态 char 数组转换成一个动态分配的 char 数组以节省内存
比如说,main();
你从一个文件中读取一个字符串,并将它扫描到一个静态声明的 char 数组中。然后创建一个动态分配的 char 数组,其长度为 strlen(string)。
前任:
在将静态分配的数组复制到动态分配的数组后,我们可以对它做些什么,还是让它在内存中腐烂?如果是这种情况,您是否应该经历使用 malloc 创建数组的麻烦?
这只是一个假设性问题,但是考虑到内存优化的最佳解决方案是什么?
python - 与 PyTorch 相比,Numpy 有限差分计算速度非常慢
我的目标是通过有限差分模拟反应扩散微分方程,但从二维波动方程开始。由于这需要相当长的时间,我想尽可能快地完成基本实现,并且一直在尝试使用 numpy/cupy/numba/pytorch 来查看哪个是最快的。让我感到非常奇怪的是,我使用 PyTorch 的实现在迭代运行所需的时间内几乎是恒定的,但是 numpy 变得越来越慢。我假设 torch 在后台运行某种智能垃圾收集,并且 numpy 不会删除未使用的数组(在内存使用量增加中可见,而 torch 是恒定的)。然而,即使在手动优化 numpy 代码以使其就地运行并删除未使用的数组之后,它仍然没有
下面是 numpy 代码,以及注释中的火炬代码。
这是经过修改以使操作就地的部分。
基本上我在问:为了让 numpy 代码与 PyTorch 实现一样快,我需要做什么?