আপনি যদি কিছু বাস্তব গতি চান:
echo 'int cache[256],x,y;char buf[4096],letters[]="tacgn-"; int main(){while((x=read(0,buf,sizeof buf))>0)for(y=0;y<x;y++)cache[(unsigned char)buf[y]]++;for(x=0;x<sizeof letters-1;x++)printf("%c: %d\n",letters[x],cache[letters[x]]);}' | gcc -w -xc -; ./a.out < file; rm a.out;
একটি অবিশ্বাস্যভাবে দ্রুত সিউডো ওয়ান-লাইনার।
একটি সহজ পরীক্ষা দেখায় যে আমার কোর আই 7 সিপিইউ 870 @ 2.93GHz এ এটি 600MB / s এর চেয়ে বেশি গণনা করেছে:
$ du -h bigdna
1.1G bigdna
time ./a.out < bigdna
t: 178977308
a: 178958411
c: 178958823
g: 178947772
n: 178959673
-: 178939837
real 0m1.718s
user 0m1.539s
sys 0m0.171s
বাছাইয়ের সাথে জড়িত সমাধানগুলির বিপরীতে, এইটি ধ্রুবক (4 কে) মেমরিতে চলে which
এবং অবশ্যই কিছুটা কনুই গ্রীস দিয়ে আমরা 0.7 সেকেন্ডের শেভ করতে পারি:
echo 'int cache[256],x,buf[4096],*bp,*ep;char letters[]="tacgn-"; int main(){while((ep=buf+(read(0,buf,sizeof buf)/sizeof(int)))>buf)for(bp=buf;bp<ep;bp++){cache[(*bp)&0xff]++;cache[(*bp>>8)&0xff]++;cache[(*bp>>16)&0xff]++;cache[(*bp>>24)&0xff]++;}for(x=0;x<sizeof letters-1;x++)printf("%c: %d\n",letters[x],cache[letters[x]]);}' | gcc -O2 -xc -; ./a.out < file; rm a.out;
নেটগুলি কেবলমাত্র 1.1GB / s এর মধ্যে শেষ করছে:
real 0m0.943s
user 0m0.798s
sys 0m0.134s
তুলনার জন্য, আমি এই পৃষ্ঠার অন্যান্য সমাধানগুলির কয়েকটি পরীক্ষা করেছি যা দেখে মনে হয়েছিল যে একরকম গতির প্রতিশ্রুতি রয়েছে।
sed
/ awk
সমাধান বীর চেষ্টা করলেন, কিন্তু 30 সেকেন্ড পর মারা যান। এই জাতীয় সরল রেগেক্সের সাথে, আমি এটি সেডে একটি বাগ হওয়ার প্রত্যাশা করব (জিএনইউ সেড সংস্করণ ৪.২.১):
$ time sed 's/./&\n/g' bigdna | awk '!/^$/{a[$0]++}END{for (i in a)print i,a[i];}'
sed: couldn't re-allocate memory
real 0m31.326s
user 0m21.696s
sys 0m2.111s
পার্ল পদ্ধতিটিও আশাব্যঞ্জক বলে মনে হয়েছিল, তবে আমি এটি 7 মিনিটের জন্য চালানোর পরে ছেড়ে দিয়েছি
time perl -e 'while (<>) {$c{$&}++ while /./g} print "$c{$_} $_\n" for keys %c' < bigdna
^C
real 7m44.161s
user 4m53.941s
sys 2m35.593s