八度强制深度扫描

时间:2016-03-05 18:48:00

标签: octave deep-copy

问题

有什么方法可以强制八度音阶来创建任何对象的真实副本?结构是主要的兴趣。

我的潜在问题

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

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。如果您强制使用正确的副本,则问题不存在。

1 个答案:

答案 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>

相关问题