Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl:计算大型数据集的相关系数时的编程效率_Perl_Memory_Performance_Dataset - Fatal编程技术网

Perl:计算大型数据集的相关系数时的编程效率

Perl:计算大型数据集的相关系数时的编程效率,perl,memory,performance,dataset,Perl,Memory,Performance,Dataset,编辑:链接现在应该可以工作了,很抱歉给您添麻烦 我有一个如下所示的文本文件: Name, Test 1, Test 2, Test 3, Test 4, Test 5 Bob, 86, 83, 86, 80, 23 Alice, 38, 90, 100, 53, 32 Jill, 49, 53, 63, 43, 23. open FILE, ">", "file.txt" or die $!; print FILE "Name, ", join(", ", 0..$#{$correlati

编辑:链接现在应该可以工作了,很抱歉给您添麻烦

我有一个如下所示的文本文件:

Name, Test 1, Test 2, Test 3, Test 4, Test 5 Bob, 86, 83, 86, 80, 23 Alice, 38, 90, 100, 53, 32 Jill, 49, 53, 63, 43, 23.
open FILE, ">", "file.txt" or die $!;
print FILE "Name, ", join(", ", 0..$#{$correlations[0]}+1), "\n";
my $rowno = 1;
foreach my $row (@correlations) {
  print FILE "$rowno, " . join(", ", @$row) . "\n";
  $rowno++;
}
close FILE;
名称、测试1、测试2、测试3、测试4、测试5 鲍勃,86,83,86,80,23 爱丽丝,38,90,100,53,32 吉尔,49,53,63,43,23。 我正在编写一个程序,给定这个文本文件,它将生成一个皮尔逊相关系数表,如下所示,其中条目(x,y)是人x和人y之间的相关性:

Name,Bob,Alice,Jill Bob, 1, 0.567088412588577, 0.899798494392584 Alice, 0.567088412588577, 1, 0.812425393004088 Jill, 0.899798494392584, 0.812425393004088, 1 姓名,鲍勃,爱丽丝,吉尔 鲍勃,1,0.567088412588577,0.899798494392584 爱丽丝,0.567088412588577,1,0.812425393004088 吉尔,0.899798494392584,0.812425393004088,1 我的程序运行正常,除了我输入的数据集有82列,更重要的是,有54000行。当我现在运行我的程序时,速度非常慢,并且出现内存不足错误。有没有办法,我可以首先,消除任何可能的内存不足的错误,并可能使程序运行更有效一点?代码在这里:

谢谢你的帮助,
杰克


编辑:如果其他人试图进行大规模计算,请将数据转换为hdf5格式。这就是我为解决这个问题所做的。

您必须至少进行54000^2*82次计算和比较。当然要花很多时间。你把一切都记在记忆里了吗?那也会很大。它会更慢,但如果您可以将用户保留在数据库中,并根据所有其他用户计算一个用户,它可能会使用更少的内存,然后继续进行下一步,针对所有其他数组或散列进行操作,而不是一个大型数组或散列。

看看如何处理将输入和输出文件存储在内存中的高内存使用率。

我不太清楚您试图做些什么,以便对实现提供良好的建议,但您可能会看到,它声称有一种方法可以返回pearson的r相关系数。

本质上,Paul Tomblin已经给了你答案:计算量很大,所以需要很长时间。它包含大量数据,因此需要大量内存

但是,可能有一个问题:如果使用Perl5.10.0,每个方法开头的列表分配可能是该版本perl(参见)中一个微妙性能错误的受害者

有几个要点:

打印输出实际上可能会降低程序的速度,具体取决于程序运行的位置

没有必要为每一行重新打开输出文件!就这样做吧:

Name, Test 1, Test 2, Test 3, Test 4, Test 5 Bob, 86, 83, 86, 80, 23 Alice, 38, 90, 100, 53, 32 Jill, 49, 53, 63, 43, 23.
open FILE, ">", "file.txt" or die $!;
print FILE "Name, ", join(", ", 0..$#{$correlations[0]}+1), "\n";
my $rowno = 1;
foreach my $row (@correlations) {
  print FILE "$rowno, " . join(", ", @$row) . "\n";
  $rowno++;
}
close FILE;

最后,虽然我在任何时候都可以使用Perl,但是使用一个程序和数据集,如您所描述的,使用C++的IOFROW(这使得解析足够简单)来完成这个任务可能是最简单的路径。


请注意,所有这些都只是轻微的优化。没有算法增益。

您搜索过CPAN吗?我自己的搜索产生了另一种计算皮尔逊相关性的方法——gsl_统计相关法。这个在里面。此模块绑定到GNU科学库

gsl_stats_correlation($data1,$strip1,$data2,$strip2,$n)-此函数有效地计算数组引用$data1和$data2之间的皮尔逊相关系数,两者必须具有相同的长度$n。r=cov(x,y)/(\Hat\sigma\ux\Hat\sigma\uy)={1/(n-1)sum(x\u i-\Hat x)(y\u i-\Hat y)over\sqrt{1/(n-1)sum(x\u i-\Hat x)^2}\sqrt{1/(n-1)sum(y\u i-\Hat y)^2}

您可能想看看:

PDL(“Perl数据语言”)提供 标准Perl具有紧凑的 存储并快速操作 大型N维数据数组 是科学的面包和黄油吗 计算


.

除了上面关于PDL的评论,下面是如何非常有效地计算关联表的代码,即使是非常大的数据集:

use PDL::Stats; # this useful module can be downloaded from CPAN
my $data = random(82, 5400); # your data should replace this
my $table = $data->corr_table(); # that's all, really

您可能需要设置
$PDL::BIGPDL=1并确保在内存丰富的机器上运行此脚本。计算本身相当快,一个82 x 5400的表在我的笔记本电脑上只用了几秒钟。

很抱歉程序在(50849523)处内存不足。我想做的一件事是在计算时输出,而不是在数组中存储计算值。但是,我如何利用镜像属性,[$I][$j]中的值在输出期间与[$j][$I]中的值相同?如果我采用数据库方法,什么样的资源会对我有所帮助?@Jack,我个人只会使用ODBC和PostgreSQL或MySQL,因为我在Perl中做了很多这方面的工作,但是@singingfish对Tie::File的建议可能更简单。实际上,DBD::SQLite将是最快、最简单的数据库解决方案,但出于您的目的,tie::file将是最简单的。请记住,Perl也有一种方法可以将哈希与文件或数据库后端“绑定”(这是关键字,您可以用谷歌搜索它)。所以它感觉像一个普通的散列,但一次只有一部分在内存中。我遇到了一个问题。所以我能够将@correlations绑定到一个文件,但是@correlations的单个行数组变得太大了。有没有办法做到这一点,将不断变化的变量绑定到不同的文件?tie@correlations{i},'tie::File',“temp//tiefile$i”;