有什么方法可以强制八度音阶来创建任何对象的真实副本?结构是主要的兴趣。
在我的问题中,我从循环中的另一个函数获得了一个相当大的结构,但是对于当前任务,只需要几个部分。例如:
for i=1:many
res=solver(params);
store1{i}=res.string1;
store2{i}=res.arr(:,1);
end
res
是一个相当大的数据块,由于延迟复制,store
- s引用了该块中的微小部分字节。在我存储这些微小的部分后,我不需要res
本身,但是,由于该块的中间部分被store
引用,因此内存区域不适合res
获得的struct
下一次迭代(它们具有相同的大小),因此分配了另一个相当大的内存,然后再由几个微小的链接交叉,等等。
在不存储res部分的情况下,程序在前几次迭代后成功地保持内存消耗相同。
那么如何制作完整的结构字段?
我尝试使用rmfield
相关的函数,例如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;
,但这些函数会保留引用而不是自己的对象。
我试图将其赋值包装在自己的函数中:
new_struct = copy(rmfield(old_struct," bigdata"));
功能c =副本(a);
C = A;
结束;
顺便说一下,即使对于数组也没有用。
我对适用于任何通用变量的方法感兴趣。
whos
由于a{i}
存储的引用阻塞了比实际需要更大的内存块,上面的代码将导致内存使用量逐渐增长,远远超过c=a+0;
报告的8.08 kb。如果您强制使用正确的副本,则问题不存在。
答案 0 :(得分:0)
对于数字类型,添加零就足以保证新数组。
1 x n
对于c=[a "a"](1:end-1);
char数组的字符串,沿着以下行的内容将起作用:
c=[a true(size(a,1),1)](:,1:end-1);
多维char数组需要与列连接:
true
这里char(zeros(size(a,1),1))
用于生成与char兼容的虚拟数组。 (似乎没有生成任意大小的char数组的过程方法)char(true(size(a,1),1))
和c=[a ""];
在某些调用创建过程中导致过多的内存使用。
请注意,空连接c=[a+0 ""];
不会导致复制。此外,+0
可能会导致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);
而导致复制,但会推断出与double相似的类型转换,这是大小的8倍。 (+0
似乎不会导致这种情况)
一般情况下,您可以使用casting作为其允许的类型,以便不像我上面那样手动定制表达式:
[{"android_id":"4b76f380a2734530","date":"11\/11\/1992","entry":"Ate a peanut"},{"android_id":"4b76f380a2734530","date":"11\/11\/1994","entry":"Ate an banana"}]
Single是octave中看似最小的数据类型。 请注意,此方法不支持逻辑。
显然你必须编写自己的函数来绕过struct字段,用上面的方法复制它们并递归转到substructs。
(因为它不涉及这里的复杂性,我宁愿让那些真正需要它的人完成,我自己的问题由[
{
"android_id": "4b76f380a2734530",
"date": "11\/11\/1992",
"entry": "Ate a peanut"
},
{
"android_id": "4b76f380a2734530",
"date": "11\/11\/1994",
"entry": "Ate an banana"
}
]
解决。)< / p>