Awk - 大阵列尺寸的优化

时间:2016-06-02 17:18:15

标签: awk

我有一些简单的awk数组函数,它们在阵列大小达到约500万时表现良好,大约有700万次性能下降。我想知道原因是什么以及如何解决它的任何建议。

function rand_init(l_rseed) { 
"date +%N"|getline l_rseed; 
srand(l_rseed); 
close("date +%N"); 
PROCINFO["sorted_in"]="@ind_num_asc"; 
}   

function get_rand(max) { return int(rand()*max); }

function rm_element(l_ind) { 
g_my_arr[l_ind]=g_my_arr[g_my_arr_sz--]; 
}

function get_rand_element(l_ridx,l_ret) { 
l_ridx=get_rand(g_my_arr_sz);
l_ret=g_my_arr[l_ridx]; 
rm_element(l_ridx); 
return l_ret; 
}

BEGIN {
rand_init();
g_start_size=7000001; ## 50000001 is quick
for(i=1;i<g_start_size;i++) { 
 g_my_arr[i]=(i)
}
g_my_arr_sz=length(g_my_arr); 
print "size of array is "(g_my_arr_sz);
print "getting a few random elements ..."
 ## Randomly remove all except last 10 elements.
for (i=1;i<(g_start_size-10);i++) get_rand_element(); 
for (i=1;i<=g_my_arr_sz;i++) print "New Array, Index("(i)"): "(g_my_arr[i]);
print "Size of the array is now: "(g_my_arr_sz)
}

从g_start_size = 5000001开始,情况相当顺利。

size of array is 5000000
getting a few random elements ...
New Array, Index(1): 4306493
New Array, Index(2): 316250
New Array, Index(3): 1305392
New Array, Index(4): 602315
New Array, Index(5): 1204246
New Array, Index(6): 4535772
New Array, Index(7): 3865333
New Array, Index(8): 4837828
New Array, Index(9): 88774
New Array, Index(10): 1718274
Size of the array is now: 10

real    0m22.098s
user    0m21.116s
sys 0m0.758s

向上移动到g_start_size = 7000001,事情变得缓慢。

size of array is 7000000
getting a few random elements ...
New Array, Index(1): 894985
New Array, Index(2): 3431108
New Array, Index(3): 240856
New Array, Index(4): 6897693
New Array, Index(5): 3735959
New Array, Index(6): 934555
New Array, Index(7): 1472357
New Array, Index(8): 3793277
New Array, Index(9): 3326249
New Array, Index(10): 6639585
Size of the array is now: 10

real    4m24.952s
user    0m47.130s
sys 1m20.942s

1 个答案:

答案 0 :(得分:0)

(1)awk具有关联数组,而不是基于整数的数组。您可能需要考虑使用支持基于整数的数组的解释语言。例如,由于ruby具有类似awk的模式,您可能需要考虑这一点。

(2)如果“ary”是一个数组,那么你可以使用“delete ary”对内存使用情况进行一些控制。

(3)在我的Mac上,使用gawk,你的程序在时间上与g_start_size大致成比例(例如5e6为11s,7e6为17s)。

(4)mawk略快(例如7e6为15s)。