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

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

Chinaunix

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

split內(nèi)存占用太大怎么辦 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2013-11-14 19:52 |只看該作者 |倒序?yàn)g覽
現(xiàn)在有圖1所示文件,包含了數(shù)百萬個(gè)位點(diǎn)的信息,相互之間用空格分開。
現(xiàn)在需要找出指定開始和終止位置之間的信息,統(tǒng)計(jì)有多少是大于3的。
比如需要統(tǒng)計(jì)第3000-5000個(gè)位點(diǎn)內(nèi),有多少個(gè)位點(diǎn)的數(shù)字是大于3.
如果用split,內(nèi)存會(huì)飆到十多G,不適用。substr也不好用,因?yàn)槿绻麛?shù)字為兩位數(shù)或者三位數(shù),則會(huì)占用多個(gè)字符位置,沒辦法統(tǒng)計(jì)。
請(qǐng)問應(yīng)該怎么解決這個(gè)問題?

1.jpg (177.82 KB, 下載次數(shù): 103)

圖1

圖1

論壇徽章:
7
戌狗
日期:2013-12-15 20:43:38技術(shù)圖書徽章
日期:2014-03-05 01:33:12技術(shù)圖書徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16賽季CBA聯(lián)賽之青島
日期:2016-03-17 20:36:13
2 [報(bào)告]
發(fā)表于 2013-11-15 01:18 |只看該作者
本帖最后由 rubyish 于 2013-11-14 21:19 編輯

example:
  1. #!/usr/bin/perl

  2. my $data = '0 0 0 1 2 3 4 5 6 7 8 1 1 1 11 15 16 0 0 0 0 12';
  3. my ( $begin, $end, $num, $count ) = ( 5, 15, 3, 0 );
  4. my ( $L1, $L2 ) = ( $begin - 1, $end - $begin + 1 );
  5. my ($wanted) = $data =~ /^(?:\S+\s+){$L1}((?:\S+\s+){$L2})/;

  6. $& > $num and $count++ while $wanted =~ /\S+/g;
  7. print "P$begin ~ P$end [ data > $num ] count = $count\n";
復(fù)制代碼

論壇徽章:
33
榮譽(yù)會(huì)員
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-17 06:23:27操作系統(tǒng)版塊每日發(fā)帖之星
日期:2016-04-18 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-24 06:20:0015-16賽季CBA聯(lián)賽之天津
日期:2016-05-06 12:46:59
3 [報(bào)告]
發(fā)表于 2013-11-15 08:36 |只看該作者
回復(fù) 1# raoweijian

不是太清楚樓主的數(shù)據(jù)是來自文件還是哪里. 另外, 數(shù)據(jù)的總量有多大.

如果數(shù)據(jù)能讀入內(nèi)存(全部或一行), 可以使用split, 不過, 要加個(gè)參數(shù), 類似

  1. my $others = $data;
  2. my ($first, $others) = split(/\s+/, $others, 2);
復(fù)制代碼
這樣, 你的數(shù)據(jù)會(huì)分成兩部分, 前一部分只有一個(gè)數(shù)字, 所有的其它的數(shù)據(jù)都在另一部分, 這樣, 占用的內(nèi)存應(yīng)該不是太大. 然后, 繼續(xù)split下去就行了. 每次只處理一個(gè)數(shù)據(jù).
   

論壇徽章:
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
4 [報(bào)告]
發(fā)表于 2013-11-15 10:11 |只看該作者
本帖最后由 jason680 于 2013-11-15 10:22 編輯

回復(fù) 1# raoweijian

How about this example ...
Note: you can control them by yourself

$ cat get_long_string.pl
#!/usr/bin/perl
use strict;
use warnings;

$_="1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80";

my $sCnt = 1;
my $sOut = "";
while(m/((?:\S+\s+){10})/g){ # 10 items for one times
  if(31 <= $sCnt && $sCnt <= 50){
    $sOut .= $1
  }
  $sCnt +=10;   # 10 items for one times
}
print "Out=$sOut\n";

$ perl get_long_string.pl
Out=31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
   

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2013-11-15 11:30 |只看該作者
try~ set $/:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. my $str = join(' ' => 1..22);

  5. print $str,"\n";
  6. {
  7.   open my $fh, '<', \$str or die $!;
  8.   local $/=' ';
  9.   while ( <$fh> ) {
  10.     print "$_\n";
  11.   }
  12. }
復(fù)制代碼

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2013-11-15 13:28 |只看該作者
  1. use strict;
  2. use warnings;

  3. $_="1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80";

  4. my ($start,$end,$dataStart,$i)=(31,50,0,0);
  5. my @myList;

  6. while(/\s+/g)
  7. {
  8.         $i++;
  9.         push(@myList,substr($_,$dataStart,pos($_)-$dataStart-1)) if($i>=$start&&$i<=$end);
  10.         $dataStart=pos($_);
  11. }

  12. print join(",",@myList),"\n";
復(fù)制代碼
這個(gè)如何

論壇徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午馬
日期:2014-08-06 03:56:58
7 [報(bào)告]
發(fā)表于 2013-11-15 13:44 |只看該作者
嘆為觀止{:2_178:}

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2013-11-15 14:42 |只看該作者
看來還是我對(duì)正則匹配了解得不夠。這個(gè)數(shù)據(jù)一共有200M,大約3000W個(gè)位點(diǎn),3樓說的方法每次處理一個(gè)似乎并不適用。
二樓和四樓都用到了/^(?:\S+\s+){$L1}((?:\S+\s+){$L2})/類似這樣的匹配,不過我不太看得懂。
五樓把默認(rèn)換行符改成了空格,應(yīng)該是可行的,不過我還沒具體試過。
六樓的方法之前沒用到過,代碼測試結(jié)果很好,就是while(/\s+/g),這種用法具體表示什么不是很明白。

后來我自己想了個(gè)辦法,就是每次只讀100個(gè)數(shù)字,然后判斷是否在區(qū)間內(nèi),反復(fù)循環(huán),效率也還可以接受。

論壇徽章:
7
戌狗
日期:2013-12-15 20:43:38技術(shù)圖書徽章
日期:2014-03-05 01:33:12技術(shù)圖書徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16賽季CBA聯(lián)賽之青島
日期:2016-03-17 20:36:13
9 [報(bào)告]
發(fā)表于 2013-11-16 02:17 |只看該作者
kk861123 發(fā)表于 2013-11-15 07:30
try~ set $/:
  1. local $/=' ';
復(fù)制代碼


學(xué)習(xí)了!這個(gè)速度應(yīng)該比較快。
您需要登錄后才可以回帖 登錄 | 注冊(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ū)
中國互聯(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