问题标签 [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.

0 投票
2 回答
403 浏览

web-applications - 仅在 webapps 中缓存必要的图像

我在头部有这个index.php

这在cache.manifest

但是我们很容易理解,一个 iPhone 用户需要缓存另外 5 张无用的大图。

我怎样才能让他只缓存他需要的图像?


顺便说一句,对于那些想要在每个苹果设备上运行的闪屏代码的人来说,我的是完美的。

0 投票
1 回答
708 浏览

android - 在两个渲染线程之间共享 OpenGL 纹理?

我有一个到 GLSurfaceView 的界面渲染,但在某些时候我启动了另一个渲染线程,以便能够以更大的比例渲染界面的一部分(只有几个纹理),然后将它们写为图像文件到sd卡。我想知道当我启动另一个渲染器以写入磁盘时,是否以及如何使用已经加载到 GUI 渲染线程中的大型纹理?

目前我有一个非常糟糕的解决方法,即我在加载纹理后将 bmp 保存在内存中,然后当我启动写入磁盘渲染器时,我只是从该位图创建一个新纹理。但显然,当我觉得它真的没有必要时,这既费时又耗内存,因为位图实际上已经在 GPU 中的某个地方加载为大纹理。

0 投票
1 回答
1146 浏览

android - Android位图像素 - 直接写入文件?

背景:

目标是使用 OpenGL 渲染数据编写一个相当大(至少 2048 x 2048 像素)的图像文件。

今天我首先使用 glReadPixels 将 32 位(argb8888)像素数据放入一个 int 数组中。

然后我将数据复制到一个新的短数组中,将 32 位 argb 值转换为 16 位 (rgb565) 值。此时我也将图像倒过来,改变颜色顺序,使opengl-image数据与android位图数据兼容(不同的行顺序和颜色通道顺序)。

最后,我创建了一个 Bitmap() 实例和 .copyPixelsFromBuffer(Buffer b) 以便能够将其作为 png 文件保存到磁盘。

但是,我想更有效地使用内存,以避免某些手机上的内存不足崩溃。


问题:

  1. 我可以以某种方式跳过从 int[] -> short[] 的第一次转换(并避免为像素数据分配新数组)吗?也许只是使用字节数组/缓冲区并将转换后的像素写入我读取的同一个数组......

  2. 更重要的是:我可以跳过位图创建(程序崩溃的地方)并以某种方式将数据作为工作图像文件直接写入磁盘(并避免在位图对象中再次分配像素数据)?

编辑:如果我可以将数据直接写入文件,也许我不需要转换为 16 位像素数据,具体取决于文件大小以及稍后将文件读入内存的速度。

0 投票
0 回答
2540 浏览

nosql - 优化大型 Redis Hash 和 Sorted set 的内存使用

作为分布式爬虫的一部分,我们将所有 URL 存储在Redis 排序集中,这是爬取队列和Redis 哈希(用于去重复和标记访问的 URL)。

我们在一个文件中拥有大约 1100 万个我们希望访问的各个域的 URL,该文件占用了506 MB 的磁盘空间

但是,当放入Redis 排序集时,相同的 URL 集(优先级从整数 11M 一直到 0 递减)占用 1.759 GB 的 RAM,而Redis 哈希来自键:URL-> 值:相同的 URL,占用 2.048 GB RAM 空间

redis 服务器托管在 AWS 的高内存 (17GB) 超大型 EC2 实例中。

我想弄清楚是什么导致了 Redis 中的空间膨胀,可能是因为存储它们的方式效率低下,还是我们应该以某种方式优化内存以避免空间膨胀?任何提高内存性能的建议都是 gr8。提前感谢您的帮助!

这是 redis 信息转储:

0 投票
1 回答
1698 浏览

c# - How to represent a very large bit array efficiently?

Since a boolean actually takes 1 byte of space, a bool[] isn't the most space-efficient way to represent a bit array. Sometimes integers and longs are used as a more efficient bit array, but a long can only hold 64 bits. Is there a more space-efficient way to store arrays of tens of millions bits in limited memory?

All I need to do with this array is to set/clear individual bits and to check whether some bits is 1 or 0, i.e. the only functions I need:

0 投票
1 回答
1376 浏览

ios - CGContext 的可变大小

我目前正在使用 aUIGraphicsBeginImageContext(resultingImageSize);创建图像。

但是当我调用这个函数时,我并不确切知道resultingImageSize.
确实,我开发了某种消耗大量内存的视频处理,我不能先处理后绘制:我必须视频过程中绘制。

如果我设置,例如UIGraphicsBeginImageContext(CGSizeMake(300, 400));,超过 400 的绘制部分会丢失。

那么有没有一种解决方案来设置可变大小的 CGContext,或者调整 CGContext 的大小而内存消耗很少

0 投票
1 回答
93 浏览

matlab - Memory optimisation

I'm just curious to know if I can reduce memory usage of Matlab by using some option. Clicking on a variable in workspace shows a long digit which may not be necessary in most of cases. e.g.,

for me 25.054091 may be more than ok. Are there any options that Matlab just reduce numbers for internal calculation and does it make any difference.

0 投票
2 回答
386 浏览

java - Java:通过 2D float (floats[][]) 数组减少内存消耗

我有 Java 应用程序,它集中使用 2D 浮点数组(float[][] 数组),它实际上在黑色背景上保存图像。两个维度都等于(正方形)并且是 2 的幂(大多数是 256、512、1024),因此在大多数情况下,靠近边界的区域为零。

大小等于 2 的幂是为了提高性能(有一些 FFT)并降低对这些阵列的操作(如旋转等)的复杂性。最近,我在 6Gb 的机器上遇到了这个应用程序的堆不足问题。根据我的计算 - 此应用程序的内存消耗应该高达 2-3Gb,而它达到 4-5Gb(在 Windows 任务管理器中查看)。我使用了“YourKit”分析器,它表明这些浮点数组确实占用了大部分内存,但是,这些浮点数组的总粗略大小应该是 1.3Gb(嗯,我知道由 JVM 来决定如何存储数据,但是我没想到内存消耗会相差 2-3 倍)。

我试图使用 Snappy 压缩器即时压缩/解压缩数据(内存消耗下降到 3.5Gb),但性能下降了好几次,这不是很可接受。另外,我在用 BufferedImage 替换那些 floats[][] 时测试了性能,但性能很差。

所以,剩下的 2 种方法对我来说可以减少内存消耗:1)为 float[][] 数组编写包装器以保存“零”元素(有很多“空”行和列)2 ) 远离“2 的幂”

这两种方式都需要大量的编码/重构,所以当我在想“成为或不成为”的时候——也许你对这个问题有更好的线索,伙计们?

谢谢!

0 投票
1 回答
165 浏览

c# - c#和java中的volatile有什么区别?

在我读过的一些.net文档中,这是编译器处理易失性的方式:

  • *“从 volatile 读取或使用 Thread.VolatileRead 方法在逻辑上是一个获取栅栏”
  • “写入 volatile 或使用 Thread.VolatileWrite 方法在逻辑上是一个释放栅栏” *

这些围栏适用于编译器和架构级别。

当然,VC++ 的主要区别在于栅栏仅适用于编译器级别。

所以我的问题是,Java 中 volatile 的内存重新排序预防语义是什么?

转换:

栅栏 = 屏障 屏障 = 栅栏

参考:

Joe Duffy(Windows 上的并发编程)

0 投票
5 回答
1577 浏览

c - 在 C 中读取和存储字符串列表的最节省内存的方法

我想知道在 C 中读取和存储字符串列表的最节省内存的方法是什么。

每个字符串可能有不同的长度,因此预先分配一个大的二维数组会很浪费。我还想避免为每个字符串使用单独的 malloc,因为可能有很多字符串。

字符串将从一个大缓冲区读取到我要询问的这个列表数据结构中。

是否可以使用大小正确的单个分配单独存储所有字符串?

我的一个想法是将它们连续存储在缓冲区中,然后有一个 char * 数组指向缓冲区中的不同部分,其中将包含 '\0' 来分隔。我希望有更好的方法。

数据结构和字符串将是严格只读的。