|
|
|
@ -2,9 +2,10 @@
|
|
|
|
|
#include "stdbool.h"
|
|
|
|
|
#include "stdlib.h"
|
|
|
|
|
#include <sys/mman.h>
|
|
|
|
|
#include <time.h>
|
|
|
|
|
|
|
|
|
|
#define MAX_CHUNK_SIZE 33554432*2
|
|
|
|
|
#define N_BUFFERS 8
|
|
|
|
|
#define MAX_CHUNK_SIZE 11248640
|
|
|
|
|
#define N_BUFFERS 100
|
|
|
|
|
|
|
|
|
|
int min(int value1, int value2) {
|
|
|
|
|
if (value1 < value2) return value1;
|
|
|
|
@ -22,9 +23,12 @@ int get_mod(chunk_array_t* chunk_array,int init_pos) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool inside_buffer(chunk_array_t* chunk_array,int init_pos, size_t pos) {
|
|
|
|
|
//printf("range: [%d; %d] pos: %d", init_pos, init_pos + chunk_array->chunk_size-1, pos);
|
|
|
|
|
if (pos<init_pos || pos>init_pos + chunk_array->chunk_size-1) {
|
|
|
|
|
//printf(" FALSE\n");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
//printf(" TRUE\n");
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -48,6 +52,8 @@ void buffer_flush(chunk_array_t* chunk_array, buffer_t* buffer) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void buffer_update(chunk_array_t* chunk_array, buffer_t* buffer, size_t pos) {
|
|
|
|
|
//printf("[UPDATE BUFFER][%s] old init_pos %d pos %d\n",chunk_array->filename, buffer->init_pos, pos);
|
|
|
|
|
//printf("miss pos: %d\n", pos);
|
|
|
|
|
buffer_flush(chunk_array, buffer);
|
|
|
|
|
|
|
|
|
|
if (chunk_array->mmap_array) {
|
|
|
|
@ -58,7 +64,7 @@ void buffer_update(chunk_array_t* chunk_array, buffer_t* buffer, size_t pos) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
buffer_t* buffer_create(int size) {
|
|
|
|
|
buffer_t* buffer_create(int size, int init) {
|
|
|
|
|
buffer_t * buffer = (buffer_t*)malloc(sizeof(buffer_t));
|
|
|
|
|
|
|
|
|
|
if (buffer == NULL) return NULL;
|
|
|
|
@ -70,7 +76,7 @@ buffer_t* buffer_create(int size) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
buffer->init_pos = 0;
|
|
|
|
|
buffer->init_pos = init;
|
|
|
|
|
buffer->dirty = false;
|
|
|
|
|
|
|
|
|
|
return buffer;
|
|
|
|
@ -88,21 +94,21 @@ chunk_array_t* chunk_array_create(char* filename, size_t total_size) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
printf("totalsize %d\n", total_size);
|
|
|
|
|
|
|
|
|
|
chunk_array->chunk_size = min(MAX_CHUNK_SIZE, total_size);
|
|
|
|
|
|
|
|
|
|
chunk_array->buffers = malloc(sizeof(buffer_t) * N_BUFFERS);
|
|
|
|
|
|
|
|
|
|
chunk_array->buffers[0] = buffer_create(chunk_array->chunk_size);
|
|
|
|
|
|
|
|
|
|
chunk_array->buffers[0]->init_pos = 0;
|
|
|
|
|
chunk_array->buffers[0] = buffer_create(chunk_array->chunk_size, 0);
|
|
|
|
|
|
|
|
|
|
chunk_array->n_buffers = 1;
|
|
|
|
|
chunk_array->last_updated = -1;
|
|
|
|
|
|
|
|
|
|
for (int i = 1; i<N_BUFFERS; i++) {
|
|
|
|
|
if (total_size > i*chunk_array->chunk_size) {
|
|
|
|
|
chunk_array->n_buffers++;
|
|
|
|
|
chunk_array->buffers[i] = buffer_create(chunk_array->chunk_size);
|
|
|
|
|
chunk_array->buffers[i]->init_pos = i*chunk_array->chunk_size;
|
|
|
|
|
chunk_array->buffers[i] = buffer_create(chunk_array->chunk_size, i*chunk_array->chunk_size);
|
|
|
|
|
} else {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
@ -124,16 +130,28 @@ chunk_array_t* chunk_array_create(char* filename, size_t total_size) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
buffer_t* chunk_array_update(chunk_array_t* chunk_array, size_t pos) {
|
|
|
|
|
buffer_t* buffer = chunk_array->buffers[0];
|
|
|
|
|
int distance = abs(buffer->init_pos - pos);
|
|
|
|
|
////printf("[%s] miss: %d\n",chunk_array->filename, pos);
|
|
|
|
|
//buffer_t* buffer = chunk_array->buffers[0];
|
|
|
|
|
//int distance = abs(buffer->init_pos - pos);
|
|
|
|
|
|
|
|
|
|
srand(time(NULL)); // Initialization, should only be called once.
|
|
|
|
|
int random = rand()%chunk_array->n_buffers;
|
|
|
|
|
|
|
|
|
|
while (random == chunk_array->last_updated) {
|
|
|
|
|
//printf("ACA!\n");
|
|
|
|
|
random = rand()%chunk_array->n_buffers;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for(int i=1; i<chunk_array->n_buffers; i++) {
|
|
|
|
|
chunk_array->last_updated = random;
|
|
|
|
|
|
|
|
|
|
/*for(int i=1; i<chunk_array->n_buffers; i++) {
|
|
|
|
|
int new_distance = abs(chunk_array->buffers[i]->init_pos - pos);
|
|
|
|
|
if (new_distance < distance) {
|
|
|
|
|
distance = new_distance;
|
|
|
|
|
buffer = chunk_array->buffers[i];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}*/
|
|
|
|
|
buffer_t* buffer = chunk_array->buffers[random];
|
|
|
|
|
buffer_update(chunk_array, buffer, pos);
|
|
|
|
|
return buffer;
|
|
|
|
|
}
|
|
|
|
@ -150,6 +168,7 @@ bool chunk_array_get(chunk_array_t* chunk_array, size_t pos, double *valor) {
|
|
|
|
|
for (int i = 0; i<chunk_array->n_buffers; i++) {
|
|
|
|
|
if (inside_buffer(chunk_array, chunk_array->buffers[i]->init_pos, pos)) {
|
|
|
|
|
buffer = chunk_array->buffers[i];
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -177,6 +196,7 @@ bool chunk_array_save(chunk_array_t* chunk_array, size_t pos, double valor) {
|
|
|
|
|
for (int i = 0; i<chunk_array->n_buffers; i++) {
|
|
|
|
|
if (inside_buffer(chunk_array, chunk_array->buffers[i]->init_pos, pos)) {
|
|
|
|
|
buffer = chunk_array->buffers[i];
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|