亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12下一頁(yè)
最近訪問板塊 發(fā)新帖
查看: 6395 | 回復(fù): 14
打印 上一主題 下一主題

自己寫了個(gè)Perl腳本,但是運(yùn)行很慢,麻煩各位好漢走過路過幫忙看看 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2018-04-03 10:31 |只看該作者 |倒序?yàn)g覽
大家好,我寫了個(gè)腳本但是腳本運(yùn)行的特別慢,但是文件小的話(假設(shè)2000行左右)就可以馬上運(yùn)行出來,但是文件大就特別慢好幾天了才出來一點(diǎn)點(diǎn)結(jié)果(400K左右)感覺不太正常,麻煩大家?guī)兔纯慈绾涡薷牟拍茏屗\(yùn)行速度加快,自己也不怎么懂算法,再此謝過了:具體情況見下述   我需要對(duì)一個(gè)4G左右大小的文件進(jìn)行處理,該文件內(nèi)容是這樣的----

ID1  xxx  xxx xxx 50                                   
ID1  xxx  xxx xxx 60                                   ID1  xxx  xxx xxx 60    即第5列是個(gè)分值,分值高則留下,分值一樣則都保留,ID重復(fù)的次數(shù)是>=2, 絕大部分是>=2的
ID2  xxx  xxx xxx 50                                   ID2  xxx  xxx xxx 60   
ID2  xxx  xxx xxx 60   最終需要得到右邊結(jié)果    ID4  xxx  xxx xxx 60

ID3  xxx  xxx xxx 50                                   ID4  xxx  xxx xxx 60
ID3  xxx  xxx xxx 60                                   ID3  xxx  xxx xxx 60

ID3  xxx  xxx xxx 60                                   ID3  xxx  xxx xxx 60
ID4  xxx  xxx xxx 60
ID4  xxx  xxx xxx 60  (xxx所表示的是不一樣的,所以只是ID 相同行不同)


while(<IN>){
    chomp;
    my($z,$c)=(split /\t/)[0,4];
    $hash{$z}++;
    if($hash{$z}==1){
         $hash2{$z}=$_;
         $hash4{$z}=$c;
     }
    if($hash{$z}>1){
         $hash3{$z}=$_;
         $hash5{$z}=$c;
     }
}
foreach my $key2(sort keys %hash2){
     foreach my $key3(sort keys %hash3){
          if($key2 eq $key3){
             if($hash4{$key2}>$hash5{$key3}){
               print OUT "$hash2{$key2}\n";
            }
             if($hash4{$key2}<$hash5{$key3}){
               print OUT "$hash3{$key3}\n"
           }
             if($hash4{$key2}==$hash5{$key3}){
                print OUT "$hash2{$key2}\n$hash3{$key3}\n";
           }
     }
  }}


論壇徽章:
46
15-16賽季CBA聯(lián)賽之四川
日期:2018-03-27 11:59:132015年亞洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49雙魚座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亞冠之布里斯班獅吼
日期:2015-07-13 10:44:56
2 [報(bào)告]
發(fā)表于 2018-04-03 13:59 |只看該作者
你把所有數(shù)據(jù)都放內(nèi)存里,4G的文件占用內(nèi)存可能要40G到400G

如果有3個(gè)ID一樣,你這代碼不能正確處理。

優(yōu)化思路:如果ID是排過序的,相同的連著內(nèi)存占用就是O(1)常量,處理時(shí)間只跟文件行數(shù)相關(guān)O(n)

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2018-04-03 15:43 |只看該作者
回復(fù) 2# zhlong8
非常感謝你的回答,謝謝!
文件我是已經(jīng)提前排好序了的,您的思路是  如果相同的ID連續(xù)出現(xiàn),就賦值給一個(gè)常量(假設(shè)賦值給1),是這個(gè)意思么?這樣一來也是要進(jìn)行計(jì)算重復(fù)的次數(shù)的。
我再請(qǐng)教一個(gè)問題:  腳本運(yùn)行慢是因?yàn)槲野盐募拿恳恍卸即孢M(jìn)內(nèi)存里,是if(....)判斷后再將$_存入哈希里這里出錯(cuò)了是么,這樣就是存進(jìn)內(nèi)存么?
這個(gè)是我寫的另外一個(gè)腳本,我也是把$_存進(jìn)$hash里面,文件也很大但是這個(gè)運(yùn)行速度就快
while(<DATA>{
   chomp;
   my($c,$d)=(split/\t/)[0,4];
   $hash{$c}=$_;    #這里也是將其存進(jìn)內(nèi)存么?
   $hash2{$c}++;   
   $hash3{$c}=$a9ur7n9vt
}  

foreach my $key3(sort keys %hash3){    #還是遍歷的時(shí)候會(huì)存進(jìn)內(nèi)存
   if($hash2{$key3}>1){
         print OUT "$hash{$key3}\n";

   }else{
         print OUTTTT "$hash{$key3}\n";
     }
}







論壇徽章:
46
15-16賽季CBA聯(lián)賽之四川
日期:2018-03-27 11:59:132015年亞洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49雙魚座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亞冠之布里斯班獅吼
日期:2015-07-13 10:44:56
4 [報(bào)告]
發(fā)表于 2018-04-03 23:26 |只看該作者
本帖最后由 zhlong8 于 2018-04-03 23:27 編輯

先寫正確再優(yōu)化啊。既然已經(jīng)排過序了,一個(gè)ID一個(gè)ID的處理不就行了,根本不用保存到 hash 中去。
  1. use 5.010;
  2. use strict;
  3. use warnings;

  4. my $last_id = '';
  5. my $last_score;
  6. my @queue;

  7. while (<>) {
  8.     my($id, $score) = (split /\t/)[0,4]; #每個(gè)字段位置固定的話可以用 substr
  9.     if ($id ne $last_id) { #處理完一組直接打印,無(wú)需保留中間結(jié)果
  10.         print for @queue;
  11.        @queue     = $_; #等價(jià)于清空數(shù)組長(zhǎng)度變?yōu)?,然后 $queue[0] = $_;
  12.         $last_id    = $id;
  13.         $last_score = $score;
  14.     } elsif ($score == $last_score) {
  15.         push @queue, $_;
  16.     } elsif ($score > $last_score) {
  17.         $last_score = $score;
  18.         @queue      = $_;
  19.     }
  20. }

  21. print for @queue;
復(fù)制代碼


思路基本上就這樣了,這么頻繁的讀寫的話IO可能成為瓶頸,不過你要先測(cè)一下。

論壇徽章:
42
19周年集字徽章-周
日期:2019-10-14 14:35:31平安夜徽章
日期:2015-12-26 00:06:30數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2015-12-01 06:20:002015亞冠之首爾
日期:2015-11-04 22:25:43IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-08-17 06:20:00寅虎
日期:2014-06-04 16:25:27獅子座
日期:2014-05-12 11:00:00辰龍
日期:2013-12-20 17:07:19射手座
日期:2013-10-24 21:01:23CU十二周年紀(jì)念徽章
日期:2013-10-24 15:41:34IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-01-27 06:20:0015-16賽季CBA聯(lián)賽之新疆
日期:2016-06-07 14:10:01
5 [報(bào)告]
發(fā)表于 2018-04-04 08:33 |只看該作者
我理解就是把最高分的id挑出來
那么用一個(gè)變量存最高分,用一個(gè)hash存分?jǐn)?shù)等于最高分的id xxx xxx xxx
如果最高分變了,就清空hash,
這樣從頭到尾過一遍。
不需要排序吧。
perl的文本處理速度大約是1分鐘1G左右。

論壇徽章:
145
技術(shù)圖書徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11獅子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龍
日期:2014-01-08 15:26:12技術(shù)圖書徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
6 [報(bào)告]
發(fā)表于 2018-04-04 12:05 |只看該作者
回復(fù) 1# Chinaaa123

$ cat file
ID1  xx1  xxx xxx 50                                   
ID1  xx2  xxx xxx 60
ID2  xx3  xxx xxx 50
ID2  xx4  xxx xxx 60
ID3  xx5  xxx xxx 50
ID3  xx6  xxx xxx 80
ID3  xx7  xxx xxx 80
ID4  xx8  xxx xxx 70
ID4  xx9  xxx xxx 70

$ perl get_max_val.pl file
ID1  xx2  xxx xxx 60
ID2  xx4  xxx xxx 60
ID3  xx6  xxx xxx 80
ID3  xx7  xxx xxx 80
ID4  xx8  xxx xxx 70
ID4  xx9  xxx xxx 70

$ cat get_max_val.pl

use strict;
use warnings;

# get max value and string by sorted data
my $sMax_val = 0;
my $sMax_str = "";
my $sId = "";

while(<>){
  chomp;
  next if m/^\s*$/;
  s/^\s+|\s+$//g;
  my @aData = split;
  if ($sId ne $aData[0]){
    print $sMax_str if($sMax_str ne "");
    $sMax_val = $aData[-1];
    $sMax_str = "$_\n";
    $sId = $aData[0];
    next;
  }
  if ($sMax_val < $aData[-1]){
    $sMax_val = $aData[-1];
    $sMax_str = "$_\n";
    next;
  }
  if ($sMax_val == $aData[-1]){
    $sMax_str .= "$_\n";
    next;
  }

}
print $sMax_str;

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2018-04-04 14:32 |只看該作者
你的文件重要不?不重要的話打個(gè)包上傳上來

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2018-04-04 14:38 |只看該作者
perl有沒有pandas? 這種數(shù)據(jù)pandas處理的快

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2018-04-04 16:06 |只看該作者
哇,
在此感謝上述各位大神的回復(fù),謝謝你們的幫助!
我的問題解決了,再次感謝!抱拳

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2018-04-04 16:15 |只看該作者
回復(fù) 8# dahe_1984

pandas是Python快速處理數(shù)據(jù)的一個(gè)工具,我感覺Perl本身就類似于pandas吧,也不知道理解的對(duì)不對(duì),謝謝你的回答!
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP