r197: allocate index seq names from kalloc

to reduce malloc() overhead.
This commit is contained in:
Heng Li 2017-07-24 19:36:05 -04:00
parent 5c4d040b13
commit f81f37fef1
3 changed files with 14 additions and 8 deletions

19
index.c
View File

@ -25,6 +25,7 @@ mm_idx_t *mm_idx_init(int w, int k, int b, int is_hpc)
mi = (mm_idx_t*)calloc(1, sizeof(mm_idx_t));
mi->w = w, mi->k = k, mi->b = b, mi->is_hpc = is_hpc;
mi->B = (mm_idx_bucket_t*)calloc(1<<b, sizeof(mm_idx_bucket_t));
if (!(mm_dbg_flag & 1)) mi->km = km_init();
return mi;
}
@ -37,9 +38,12 @@ void mm_idx_destroy(mm_idx_t *mi)
free(mi->B[i].a.a);
kh_destroy(idx, (idxhash_t*)mi->B[i].h);
}
for (i = 0; i < mi->n_seq; ++i)
free(mi->seq[i].name);
free(mi->seq); free(mi->B); free(mi->S); free(mi);
if (!mi->km) {
for (i = 0; i < mi->n_seq; ++i)
free(mi->seq[i].name);
free(mi->seq);
} else km_destroy(mi->km);
free(mi->B); free(mi->S); free(mi);
}
const uint64_t *mm_idx_get(const mm_idx_t *mi, uint64_t minier, int *n)
@ -228,7 +232,7 @@ static void *worker_pipeline(void *shared, int step, void *in)
old_m = p->mi->n_seq, m = p->mi->n_seq + s->n_seq;
kroundup32(m); kroundup32(old_m);
if (old_m != m)
p->mi->seq = (mm_idx_seq_t*)realloc(p->mi->seq, m * sizeof(mm_idx_seq_t));
p->mi->seq = (mm_idx_seq_t*)krealloc(p->mi->km, p->mi->seq, m * sizeof(mm_idx_seq_t));
// make room for p->mi->S
for (i = 0, sum_len = 0; i < s->n_seq; ++i) sum_len += s->seq[i].l_seq;
old_max_len = (p->sum_len + 7) / 8;
@ -244,7 +248,8 @@ static void *worker_pipeline(void *shared, int step, void *in)
uint32_t j;
if (p->keep_name) {
assert(strlen(s->seq[i].name) <= 254); // a long query name breaks BAM
seq->name = strdup(s->seq[i].name);
seq->name = (char*)kmalloc(p->mi->km, strlen(s->seq[i].name) + 1);
strcpy(seq->name, s->seq[i].name);
} else seq->name = 0;
seq->len = s->seq[i].l_seq;
seq->offset = p->sum_len;
@ -364,12 +369,12 @@ mm_idx_t *mm_idx_load(FILE *fp)
if (fread(x, 4, 5, fp) != 5) return 0;
mi = mm_idx_init(x[0], x[1], x[2], x[4]);
mi->n_seq = x[3];
mi->seq = (mm_idx_seq_t*)calloc(mi->n_seq, sizeof(mm_idx_seq_t));
mi->seq = (mm_idx_seq_t*)kcalloc(mi->km, mi->n_seq, sizeof(mm_idx_seq_t));
for (i = 0; i < mi->n_seq; ++i) {
uint8_t l;
mm_idx_seq_t *s = &mi->seq[i];
fread(&l, 1, 1, fp);
s->name = (char*)malloc(l + 1);
s->name = (char*)kmalloc(mi->km, l + 1);
fread(s->name, 1, l, fp);
s->name[l] = 0;
fread(&s->len, 4, 1, fp);

2
main.c
View File

@ -8,7 +8,7 @@
#include "minimap.h"
#include "mmpriv.h"
#define MM_VERSION "2.0-r191-dirty"
#define MM_VERSION "2.0-r197-dirty"
void liftrlimit()
{

View File

@ -46,6 +46,7 @@ typedef struct {
mm_idx_seq_t *seq; // sequence name, length and offset
uint32_t *S; // 4-bit packed sequence
mm_idx_bucket_t *B; // index
void *km;
} mm_idx_t;
typedef struct {