chunk not working

improvement-chunk_array
Oli 3 years ago
parent 90c8673110
commit bcbfaf9f75

@ -7,9 +7,10 @@
#include <string.h> #include <string.h>
#include <stdbool.h> #include <stdbool.h>
#define MAX_CHUNK_SIZE 6000 #define MAX_CHUNK_SIZE 2048
typedef struct chunk_array { typedef struct chunk_array {
char* filename;
size_t init_pos; size_t init_pos;
size_t init_read; size_t init_read;
size_t init_write; size_t init_write;

@ -110,64 +110,66 @@ void chunk_array_free(chunk_array_t* chunk_array) {
free(chunk_array); free(chunk_array);
} }
void chunk_array_update_write(chunk_array_t* chunk_array, size_t pos) {
//printf("entre a update_write con pos %d\n", pos);
int init_write = pos/chunk_array->chunk_size;
fseek(chunk_array->fp, init_write * chunk_array->chunk_size * sizeof(double), SEEK_SET);
chunk_array->init_write = init_write * chunk_array->chunk_size;
fwrite(chunk_array->write_data, sizeof(double), chunk_array->chunk_size, chunk_array->fp);
fread(chunk_array->write_data, sizeof(double), MAX_CHUNK_SIZE, chunk_array->fp);
//size_t newLen = fread(chunk_array->read_data, sizeof(double), chunk_array->chunk_size, chunk_array->fp);
//chunk_array->init_write += newLen;
}
void chunk_array_flush(chunk_array_t* chunk_array) { void chunk_array_flush(chunk_array_t* chunk_array) {
//printf("entre a flush\n"); printf("[FLUSH][%s] init_write %d\n", chunk_array->filename, chunk_array->init_write);
fwrite(chunk_array->write_data, sizeof(double), chunk_array->chunk_size, chunk_array->fp); size_t mod;
if (chunk_array->total_size - chunk_array->init_write > chunk_array->chunk_size ) {
mod = chunk_array->chunk_size;
} else {
mod = chunk_array->total_size - chunk_array->init_write;
printf("[FLUSH] ACA mod = %d\n", mod);
}
fseek(chunk_array->fp, chunk_array->init_write * chunk_array->chunk_size * sizeof(double), SEEK_SET);
fwrite(chunk_array->write_data, sizeof(double), mod, chunk_array->fp);
} }
bool chunk_array_update_read(chunk_array_t* chunk_array, size_t pos) { bool chunk_array_update(chunk_array_t* chunk_array, size_t pos) {
//printf("entre a update_read %d\n", pos); chunk_array_flush(chunk_array);
int init_read = pos/chunk_array->chunk_size;
int new_init = pos/chunk_array->chunk_size;
fseek(chunk_array->fp, init_read * chunk_array->chunk_size * sizeof(double), SEEK_SET); printf("[UPDATE] pos= %d new_init = %d\n", pos, new_init);
chunk_array->init_read = init_read * chunk_array->chunk_size; fseek(chunk_array->fp, new_init * chunk_array->chunk_size * sizeof(double), SEEK_SET);
fread(chunk_array->read_data, sizeof(double), chunk_array->chunk_size, chunk_array->fp); chunk_array->init_write = new_init * chunk_array->chunk_size;
fread(chunk_array->write_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_create(char* filename, size_t total_size) {
chunk_array_t* chunk_array = (chunk_array_t*)malloc(sizeof(chunk_array_t)); chunk_array_t* chunk_array = (chunk_array_t*)malloc(sizeof(chunk_array_t));
chunk_array->fp = fopen(filename, "w+"); chunk_array->fp = fopen(filename, "r+");
if (chunk_array == NULL || chunk_array->fp == NULL) { if (chunk_array == NULL || chunk_array->fp == NULL) {
chunk_array->fp = fopen(filename, "w+");
if (chunk_array->fp == NULL) {
return NULL; return NULL;
} }
}
chunk_array->read_data = malloc(MAX_CHUNK_SIZE * sizeof(double)); /*chunk_array->read_data = malloc(MAX_CHUNK_SIZE * sizeof(double));
if (MAX_CHUNK_SIZE > 0 && chunk_array->read_data == NULL) { if (MAX_CHUNK_SIZE > 0 && chunk_array->read_data == NULL) {
free(chunk_array); free(chunk_array);
return NULL; return NULL;
} }
//fread(chunk_array->write_data, sizeof(double), MAX_CHUNK_SIZE, chunk_array->fp);
fread(chunk_array->read_data, sizeof(double), MAX_CHUNK_SIZE, chunk_array->fp); */
fread(chunk_array->write_data, sizeof(double), MAX_CHUNK_SIZE, chunk_array->fp);
chunk_array->write_data = malloc(MAX_CHUNK_SIZE * sizeof(double)); chunk_array->write_data = malloc(MAX_CHUNK_SIZE * sizeof(double));
if (MAX_CHUNK_SIZE > 0 && chunk_array->write_data == NULL) { if (MAX_CHUNK_SIZE > 0 && chunk_array->write_data == NULL) {
free(chunk_array); free(chunk_array);
free(chunk_array->read_data); //free(chunk_array->read_data);
return NULL; return NULL;
} }
fread(chunk_array->write_data, sizeof(double), MAX_CHUNK_SIZE, chunk_array->fp);
chunk_array->filename = filename;
chunk_array->init_read = 0; chunk_array->init_read = 0;
chunk_array->init_write = 0; chunk_array->init_write = 0;
chunk_array->chunk_size = MAX_CHUNK_SIZE; chunk_array->chunk_size = MAX_CHUNK_SIZE;
@ -176,7 +178,8 @@ chunk_array_t* chunk_array_create(char* filename, size_t total_size) {
} }
bool chunk_array_get(chunk_array_t* chunk_array, size_t pos, double *valor) { bool chunk_array_get(chunk_array_t* chunk_array, size_t pos, double *valor) {
if (pos > chunk_array->init_write && pos < chunk_array->init_write + chunk_array->chunk_size) { //printf("[READ] pos = %d y init_write = %d\n", pos, chunk_array->init_write);
/*if (pos > chunk_array->init_write && pos < chunk_array->init_write + chunk_array->chunk_size) {
*valor=chunk_array->write_data[pos%chunk_array->chunk_size]; *valor=chunk_array->write_data[pos%chunk_array->chunk_size];
printf("[READ] Del write valor = %f\n", *valor); printf("[READ] Del write valor = %f\n", *valor);
return true; return true;
@ -187,15 +190,42 @@ bool chunk_array_get(chunk_array_t* chunk_array, size_t pos, double *valor) {
} }
*valor=chunk_array->read_data[pos%chunk_array->chunk_size]; *valor=chunk_array->read_data[pos%chunk_array->chunk_size];
printf("[READ] Del read valor = %f\n", *valor); printf("[READ] Del read valor = %f\n", *valor);
return true;*/
if (pos<chunk_array->init_write || pos>chunk_array->init_write + chunk_array->chunk_size-1) {
printf("[READ][%s] actualizo pos = %d init_write = %d\n",chunk_array->filename, pos, chunk_array->init_write);
//chunk_array_flush(chunk_array);
chunk_array_update(chunk_array, pos);
}
size_t mod;
if (chunk_array->total_size - chunk_array->init_write > chunk_array->chunk_size ) {
mod = chunk_array->chunk_size;
} else {
mod = chunk_array->total_size - chunk_array->init_write;
}
int real_pos = pos%mod;
*valor=chunk_array->write_data[real_pos];
printf("[READ] %s[%d] = %f = chunk[%d] init_write = %d\n", chunk_array-> filename, pos, *valor, real_pos, chunk_array->init_write);
return true; return true;
} }
bool chunk_array_save(chunk_array_t* chunk_array, size_t pos, double valor) { bool chunk_array_save(chunk_array_t* chunk_array, size_t pos, double valor) {
if (pos<chunk_array->init_write || pos>chunk_array->init_write + chunk_array->chunk_size) { //printf("[WRITE] pos = %d y init_write = %d\n", pos, chunk_array->init_write);
printf("[WRITE] actualizo porq pos = %d y init_write = %d\n", pos, chunk_array->init_write); if (pos<chunk_array->init_write || pos>chunk_array->init_write + chunk_array->chunk_size-1) {
chunk_array_update_write(chunk_array,pos); printf("[WRITE][%s] actualizo pos = %d init_write = %d\n",chunk_array->filename, pos, chunk_array->init_write);
//chunk_array_flush(chunk_array);
chunk_array_update(chunk_array,pos);
}
size_t mod;
if (chunk_array->total_size - chunk_array->init_write > chunk_array->chunk_size ) {
mod = chunk_array->chunk_size;
} else {
mod = chunk_array->total_size - chunk_array->init_write;
printf("[WRITE] ACA mod = %d\n", mod);
} }
chunk_array->write_data[pos%chunk_array->chunk_size]=valor; chunk_array->write_data[pos%mod]=valor;
printf("[WRITE] %s[%d] = %f\n", chunk_array-> filename, pos, valor);
return true; return true;
} }

@ -33,4 +33,5 @@ k=gen(nx, ny, nz, dx, dy, dz, seed, variograms, mean, variance, typ, 8)
k2 = np.load(f"out_{N}_ceci.npy") k2 = np.load(f"out_{N}_ceci.npy")
print(k==k2)
print(np.mean(k-k2)) print(np.mean(k-k2))
Loading…
Cancel
Save