#include "chunk_array.h" #include "stdbool.h" #define MAX_CHUNK_SIZE 2048*2048 int min(int value1, int value2) { if (value1 < value2) return value1; return value2; } void chunk_array_free(chunk_array_t* chunk_array) { fclose(chunk_array->fp); free(chunk_array->data); free(chunk_array); } void chunk_array_flush(chunk_array_t* chunk_array) { size_t mod; if (chunk_array->total_size - chunk_array->init_pos > chunk_array->chunk_size ) { mod = chunk_array->chunk_size; } else { mod = chunk_array->total_size - chunk_array->init_pos; } fseek(chunk_array->fp, chunk_array->init_pos * sizeof(double), SEEK_SET); fwrite(chunk_array->data, sizeof(double), mod, chunk_array->fp); } bool chunk_array_update(chunk_array_t* chunk_array, size_t pos) { chunk_array_flush(chunk_array); int new_init = pos/chunk_array->chunk_size; chunk_array->init_pos = new_init * chunk_array->chunk_size; fseek(chunk_array->fp, chunk_array->init_pos * sizeof(double), SEEK_SET); fread(chunk_array->data, sizeof(double), chunk_array->chunk_size, chunk_array->fp); } chunk_array_t* chunk_array_create(char* filename, size_t total_size) { chunk_array_t* chunk_array = (chunk_array_t*)malloc(sizeof(chunk_array_t)); chunk_array->fp = fopen(filename, "r+"); if (chunk_array == NULL || chunk_array->fp == NULL) { chunk_array->fp = fopen(filename, "w+"); if (chunk_array->fp == NULL) { return NULL; } } chunk_array->chunk_size = min(MAX_CHUNK_SIZE, total_size); chunk_array->data = malloc(chunk_array->chunk_size * sizeof(double)); if (MAX_CHUNK_SIZE > 0 && chunk_array->data == NULL) { free(chunk_array); return NULL; } fread(chunk_array->data, sizeof(double), MAX_CHUNK_SIZE, chunk_array->fp); chunk_array->filename = filename; chunk_array->init_pos = 0; chunk_array->total_size = total_size; return chunk_array; } bool chunk_array_get(chunk_array_t* chunk_array, size_t pos, double *valor) { if (posinit_pos || pos>chunk_array->init_pos + chunk_array->chunk_size-1) { chunk_array_update(chunk_array, pos); } size_t mod; if (chunk_array->total_size - chunk_array->init_pos > chunk_array->chunk_size ) { mod = chunk_array->chunk_size; } else { mod = chunk_array->total_size - chunk_array->init_pos; } int real_pos = pos%mod; *valor=chunk_array->data[real_pos]; return true; } bool chunk_array_save(chunk_array_t* chunk_array, size_t pos, double valor) { if (posinit_pos || pos>chunk_array->init_pos + chunk_array->chunk_size-1) { chunk_array_update(chunk_array,pos); } size_t mod; if (chunk_array->total_size - chunk_array->init_pos > chunk_array->chunk_size ) { mod = chunk_array->chunk_size; } else { mod = chunk_array->total_size - chunk_array->init_pos; } chunk_array->data[pos%mod]=valor; return true; }