gpt4 book ai didi

performance - 如何提高Perl处理海量数据的性能?

转载 作者:行者123 更新时间:2023-12-01 23:39:38 26 4
gpt4 key购买 nike

我正在寻找改进我的算法来分配大量数据的谜语。如果有人能想到一些让它运行得更快的好主意,我将不胜感激。

我有 8 个文件包含 2 个参数:

1) 起点

2)终点

这些类型的数据在文件中以不同的数字重复出现。意味着我可以拥有一个包含 200 个起点 + 200 个终点的文件,或者一个包含 50000 个起点 + 50000 个终点的文件。

好的,这些数据可能性反射(reflect)了 X 轴数据点。每个点的开始/结束都会被排序到X_sort_array中。

问题始于 Y 轴数据点。

为了创建 Y 轴数据点,我使用了一些算法来运行整个 X_sort_array 点,并检查每个点是否位于所有起始结束点 individuality 之间。如果是为 Y_array[x_point] 加一等等...

我将在这里粘贴我的大部分代码,如果有一种语法/方法可以更有效地执行它,我很高兴知道。

当 sort_all_legth 大于 50000 时 - 慢动作开始:

    my $sort_all_length = @{$values{"$tasks_name[$i]\_sort\_allvals"}};
my $core_count = 0;
my $m=0;

for my $k(0 .. $sort_all_length-1){



if (($values{"$tasks_name[$i]\_sort\_allvals"}->[$k] eq $values{"$tasks_name[$i]\_sort\_allvals"}->[$k-1])
& ($k != 0) ) {
}

else {
my $pre_point_flag;
# CHEACK PREVIUES POINT:
for my $inst_num(0 .. $sort_all_length/2-1){
$pre_point_flag=1;
if ( ($values{"TID$i\_$tasks_name[$i]\_SHL"}->[$inst_num] <= $values{"$tasks_name[$i]\_sort\_allvals"}->[$k]-1)
& ($values{"$tasks_name[$i]\_sort\_allvals"}->[$k]-1 <= $values{"TID$i\_$tasks_name[$i]\_EHL"}->[$inst_num]) ) {
$pre_point_flag=0;
last;
}
}
if ($pre_point_flag eq 1){
push(@{$values{"$tasks_name[$i]\_Y"}},0);
push(@{$values{"$tasks_name[$i]\_X"}},$values{"$tasks_name[$i]\_sort\_allvals"}->[$k]-1);
}

# CHEACK DEFINE POINT:
for my $inst_num(0 .. $sort_all_length/2-1){
if ( ($values{"TID$i\_$tasks_name[$i]\_SHL"}->[$inst_num] <= $values{"$tasks_name[$i]\_sort\_allvals"}->[$k])
& ($values{"$tasks_name[$i]\_sort\_allvals"}->[$k] <= $values{"TID$i\_$tasks_name[$i]\_EHL"}->[$inst_num]) ) {
$core_count++;
}

}
push(@{$values{"$tasks_name[$i]\_Y"}},$core_count);
push(@{$values{"$tasks_name[$i]\_X"}},$values{"$tasks_name[$i]\_sort\_allvals"}->[$k]);

# CHEACK LATER POINT:
for my $inst_num(0 .. $sort_all_length/2-1){
$pre_point_flag=1;
if ( ($values{"TID$i\_$tasks_name[$i]\_SHL"}->[$inst_num] <= $values{"$tasks_name[$i]\_sort\_allvals"}->[$k]+1)
& ($values{"$tasks_name[$i]\_sort\_allvals"}->[$k]+1 <= $values{"TID$i\_$tasks_name[$i]\_EHL"}->[$inst_num]) ) {
$pre_point_flag=0;
last;
}
}
if ($pre_point_flag eq 1){
push(@{$values{"$tasks_name[$i]\_Y"}},0);
push(@{$values{"$tasks_name[$i]\_X"}},$values{"$tasks_name[$i]\_sort\_allvals"}->[$k]+1);
}

if ($y_max_val < $core_count){
$y_max_val = $core_count;
}

$core_count = 0;
$m++;
}



}

具有良好性能的小数据示例:

(IP 大小为 50000 时性能较差!)

database: task: byte_position

database: binary file size: 3216

database: numbers of start/end values = 804

database: counting active cores in sorted I.P array (size: 1608)...

database: I.P array value:

375127997,375135023,375177121,375177978,375225484,375226331, 375273745,375274563,375320063,375325255,375372479,375377085, 375422115,375422896,375473198,375474058,375517412,375518169, 375561967,375562760,375606301,375607092...

测试示例输入/输出:

输入是 X 轴上的起点和终点:

16,255

16,255

16,255

100,355

200,455

database: task: TEST

database: binary file size: 20

database: numbers of start/end values = 5

database: sorted I.P array (X axis):

16,16,16,100,200,255,255,255,355,455

这些点中的每一个都称为有趣点(在 X 轴上)。

为了计算 Y 值,我用每个 I.P 画一条垂直线

然后我计算有多少输入线(起点/终点)穿过第一条垂直线。

结果是第一个 X I.P 的第一个 Y 点

database: counting active cores in sorted I.P array (size: 10)...

输出向量:

database: sorted cores array (Y axis):

0,3,4,5,5,2,1,0

在我的算法中,我在每个开始/结束 block 的 IP 之前和之后添加了另一个点。

这样你就可以在开头/结尾看到零!

3 - 表示 X 点 16 处有 3 条切片线

4 - 表示在 X 点 100 处有 4 条切片线

5 - (1)表示在X点200处有5条切片线

5 - (2)表示在X点255处有5条切片线

2 - 表示在 X 点 355 处有 2 条切片线

1 - 表示在 X 点 455 处有 1 条切片线

希望这些扩展示例能让您更好地理解算法。 :)

我将重建代码以提高可读性。

谢谢,尤达。

最佳答案

提高绩效的一个非常简单的方法就是学习更好的编码实践。

您忽略的一个原则是:不要重复自己。

您多次重复其中的某些代码,迫使 Perl 一次又一次地计算相同的表达式。此字符串的一个示例是:

"$tasks_name[$i]\_sort\_allvals"

它在那里被使用了大约10次。这意味着每次使用它时,perl 都会引用该数组(以防它发生更改)并将该字符串组合在一起。看起来可能不多,但最终会增加。

另一个例子是这样的:

$values{"$tasks_name[$i]\_sort\_allvals"}->[$k]

它也使用了 10 次,虽然 $k 实际上改变了每个循环,但对于每次循环运行,整个表达式的值是相同的。在循环开始时将其存储在单个标量中,然后在其余部分中使用该标量会更快,因为您可以避免强制 Perl 每个循环解析引用 10 次。

关于performance - 如何提高Perl处理海量数据的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2019298/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com