我做了散列哈希,其中文件的所有行根據其第5個字段的值排序到「主」哈希鍵。將每個散列鍵和它的值打印在新文件中?
%Tiles
有n個鍵,其中每個鍵是不同的$Tile_Number
。
%Tiles
的每個元素的值是對散列散列的引用,其中包含所有行,其中$Tile_Number
是當前散列鍵的編號。每個這些新密鑰(行)的值僅爲1.
$Tiles{$Tile_Number}{$Line}=1
,其中$Tiles{$Tile_Number}
有許多$Line=1
條目。
我想在單獨的文件中打印每個$Tiles{$Tile_Number}
散列,最好在創建$Tile_Number
鍵時創建該文件,並且在添加每個新的$Tiles{$Tile_Number}{$Line}=1
以打印時節省內存。
最好的辦法是不打印最終值(1),但我可以做到這一點。
我該如何讓Perl爲「主」散列中的每個鍵打開一個新文件並打印其所有鍵?
代碼:
use strict;
use warnings;
my ($Line) = "";
my (@Alignment_Line) =();
my (%Tiles) =();
my $Huge_BAM_File= $ARGV[0] or die $USAGE;
open(HUGE_BAM_FILE,"< $Huge_BAM_File") || die "Sorry I couldn't open the INPUT file: $Huge_BAM_File !\n";
while(<HUGE_BAM_FILE>){
### Remove new line characters "\n"
### Split each line by "\t" and by ":" (for fields within READ ID FIELD)
chomp;
$Line = $_;
@Alignment_Line = split(/\t+|\:/, $Line);
my $Tile_Number = $Alignment_Line[4]
##########################################################
### Fill in hash of hashes %Tiles ###
### Key = $Tile_Number ###
### Second key is $Line ###
### and is filled with a 1 ###
### Each key contains all the alignments with that tile###
### number ###
##########################################################
$Tiles{$Tile_Number}{$Line} = 1;
##Here, I would like to write this new entry into the corresponding file,
and maybe remove it from the hash so the program doesn't run out of memory.
}
接近(HUGE_BAM_FILE); close(ALL_OUTPUTS_GENERATED);
您預計會有多少個$ Tile_Number值?對於每個值,$ Line有多少個值?我認爲你尋求的答案取決於這些數字。另外,爲什麼您要節省內存,因爲許多現代計算機都有可用的RAM? – AdrianHHH 2013-05-06 16:41:50
我期待96 $ Tile_Number,每個包含10-15百萬個條目,並且爲8個項目並行執行此操作。 – 2013-05-06 17:15:53