繁体   English   中英

倍频力深度复制

[英]Octave force deepcopy

这个问题

强制八度创建任何对象的真实副本的方法是什么? 结构是主要的兴趣所在。

我的根本问题

在我的问题中,我从一个循环中的另一个函数获得了一个相当大的结构,但是对于当前任务,只需要其中的几个。 例如:

for i=1:many
    res=solver(params);
    store1{i}=res.string1;
    store2{i}=res.arr(:,1);
end

res是一个相当大的数据块,由于延迟复制,这些store -s引用了该数据块中字节的一小部分。 在存储了这些微小的部分之后,我不需要res本身,但是,由于该块的中间被store引用了,因此内存区域不适合下一次迭代获得的res (它们具有相同的大小),因此另一个分配了相当大的内存,然后又被一些微小的链接交叉,依此类推。

在不存储部分res的情况下,该程序在前几次迭代后成功地使内存消耗保持不变。

那么,如何制作结构字段的完整副本? 我尝试过使用与struct相关的函数(例如rmfield但是这些函数保留引用而不是它们自己的对象。 我试图将其分配包装在其自身的函数中:new_struct = copy(rmfield(old_struct,“ bigdata”)); 函数c = copy(a); C = A; 结束; 顺便说一下,这甚至对于数组也不起作用。 我对适用于任何泛型变量的方法感兴趣。

问题的最小工作示例

a=cell(3,1); 
for i=1:length(a); 
    r=rand(100000,1000);
    a{i}=r(1:100,end);
    whos; fflush(stdout);
    pause(2); 
end;

上面的代码将导致存储器使用逐步通过报道远远超过8.08 kb的生长whos由于由存储的引用a{i}阻断更大存储器块比实际需要的。 如果强制使用正确的副本,则不会出现问题。

数值数组

对于数字类型,添加零就足以保证使用新数组。

c=a+0;

字符串

对于1 xn char数组的字符串,以下几行将起作用:

c=[a "a"](1:end-1);

多维char数组将需要与列连接:

c=[a true(size(a,1),1)](:,1:end-1);  

这里true用于生成大小与char兼容的伪数组。 (似乎没有生成任意大小的char数组的程序方法) char(zeros(size(a,1),1))char(true(size(a,1),1))导致在使用过程中过多的内存使用他们在某些电话上的创作。

请注意,空串联c=[a ""]; 不会导致复制。 也可以做c=[a+0 ""]; 这将导致由于+0而导致的复制,但是一个会推断出类型转换为double的大小是double的两倍。 char(zeros(似乎不会导致这种情况)

其他种类

通常,您可以对它允许的类型使用强制类型转换 ,以免像我在上面所做的那样手动调整表达式:

typelist={"double","single","char"}; %full list of supported types is available in the link
class_of_a = typelist{ isa(a,typelist) };
c=typecast( [typecast(a,'single'); single(1)] (1:end-1), class_of_a);

Single似乎是八度中可用的最小数据类型。 请注意,此方法不支持逻辑。

复制结构

显然,您必须编写自己的函数才能遍历struct字段,使用上述方法复制它们,然后递归地访问子结构。
(由于这里不涉及相关的复杂性,我宁愿让那些真正需要它的人来完成,我自己的问题由+0来解决。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM