Array limits and memory allocation . . .

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Greetings GCC people,

Thank you all for the helpfull tips. The problem really was the system
size limit of the stack. I've just used the ulimit and the problem was
gone.
By the way, I don't know how to use memory allocation to create very
large arrays (> 10^6 positions). My programs are very simple. But I've
to load a entire genome/chromosome in a array. And the genome is just
a very long string (at most 250000000 of chars).
Some weeks ago, I wrote some perl scripts to do the same task but
they're much more slow then the C versions. There's a code example.
It's really a silly code so any comments will be very helpfull.

Best regards,
-- 
Daniel Marques
GFT - Grupo de Física Teórica
IFSC - Instituto de Física de São Carlos
sala 16 - Edifício central
tel: +55(16)33759769 ramal 25
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SIZE 250000000
#define N 10000000

int main(int argc, char *argv[]){

	FILE *gen, *arq1, *fdp;
	
	char *p, str[2], strng[80], g[SIZE], w[SIZE], c;
	int key, i, j, count, cnt, counter[N+1], sum;
	int counts[N];
	int p0, p1, p2, index, cmp;
	
	p0 = 1; p1 = 4; p2 = 16;
	count = 0;
	
	
	gen = fopen("ltrnsgn.txt", "r");
	while(!feof(gen)) {
		if((p = fgets(str,2, gen)) != NULL){
		g[count] = *p;
		count++;
		}
	}
	fclose(gen);
	
	for(i = 0; i < count; i++){ 
		
		if(g[i] == 'A') g[i] = 0;
		else if(g[i] == 'T') g[i] = 1;
		else if(g[i] == 'G') g[i] = 2;
		else if(g[i] == 'C') g[i] = 3;

	}
	
	for(index = 0; index < 64; index++){
	
		i = j = cnt = sum = 0;
		for(i = 0; i < N; i++){counts[i] = 0; counter[i] = 0;}
		for(i = 0; i < count-2; i++) w[i] = 0;
	
		for(i = 0; i < count-2; i++){
			cmp = g[0+i]*p0+g[1+i]*p1+g[2+i]*p2;
			if(index == cmp) w[i] = 1;
			else w[i] = 0;
			
		}
	
		for(i = 0; i < count-2; i++){
			if(w[i] == 1){
				cnt = cnt++;
				j++;
			}
			else if(w[i] == 0){
				counts[j] = counts[j]++;
			}
		}
		for(i = 0; i < count-2; i++){
			 counts[i] =  counts[i] - 2;
			 if(counts[i] < 0) counts[i] = 0;
		}
		
		for(i = 0; i < N; i++){
			key = 1;
			j = 1;
			while(key == 1){
				if(counts[i] < j){counter[j] = counter[j]++; key = 0;
				}else{j++; key = 1;}
			}
		}
	
		for(i = 0; i < N; i++) sum += counter[i];
	
		sprintf(strng, "all3times%d.dat", index);
		
		arq1 = fopen(strng, "w");
	
		for(i = 0; i < N; i++){
			if(counter[i]){
				fprintf(arq1, "%d %10.9f\n", i, (float)counter[i]/(float)(sum));
			}
		}
	
		fclose(arq1);
	}

	return (0);
}

[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux