android - 在android renderscript中使用大数据数组时等待阻塞GC ProfileSaver
问题描述
我想使用渲染脚本来处理一些需要为每个执行的线程提供相当“大”数据数组的东西。我仍然不确定它是否足够大,但使用它会在 logcat 中触发“等待阻塞的 GC ProfileSaver”消息,并像......永远阻止应用程序。我正在使用在 rs 文件中定义的自定义结构,如下所示:
typedef struct myStruct {
int data[65000];
} myStruct_t;
并在 rs 内核中使用它,使用 forEach 函数调用:
// in rs file
myStruct_t RS_KERNEL process(myStruct_t aIn, uint32_t x) {
myStruct_t aOut;
// do stuff with aIn and save the result in aOut.
// and finally return aOut
return aOut;
}
// in java file
...
RenderScript rs = RenderScript.create(this);
Element el = ScriptField_myStruct.createElement(rs);
alloc = Allocation.createSized(rs, el, 10);
retval = Allocation.createTyped(rs, alloc.getType());
process = new ScriptC_process(rs);
...
alloc.copyFromUnchecked(data); // data is array of integer
process.forEach_process(alloc, retval);
基本上,我有 650K 数据(int)要处理,我想使用 renderscript 将其分布在 10 个线程中。但是,当我将数组缩小到大约 2000,并将分配计数增加到 325(总共仍然是 650K)时,仍然出现“等待阻塞 GC ProfileSaver”,但应用程序可以在 13-14 秒后显示主要活动延迟(由于 GC)。我很确定我没有内存问题(有大量可用内存)。
这对于自定义元素来说是否太大而无法在其中包含 65K 数组数据?我可以使用任何解决方法吗?
提前致谢!
解决方案
我在分配时使用不同的方法解决了这个问题。我不是使用每个具有 65k 个整数的自定义结构(元素)然后分配其中的 10 个(所以 65k * 10 = 650k),而是一次性分配 650k 个整数并使用 ScriptC'bind_${var}
在 rs 内核中访问它们。
推荐阅读
- python - 数据溢出到另一列
- replace - 如何替换 Tableau 交叉表中单元格中的特定值?
- asp.net-core - SignalR - 通过后台服务发送给客户端
- java - 在 Java 中逐行读取文本
- if-statement - Netlogo: Turtle checking if it can move into a valid target
- html - 克隆表行时,如何只克隆先前输入的一个值而不是全部?
- html - 如何正确实现标签控件的可访问性
- c# - 为 DbSet 创建扩展方法是一种不好的做法吗
? - ruby-on-rails - rails 活动记录返回错误的类类型
- design-patterns - 通过构造函数或方法添加参数