|
|
|
@ -1,6 +1,7 @@
|
|
|
|
|
#include "chunk_array.h"
|
|
|
|
|
#include "stdbool.h"
|
|
|
|
|
#include "stdlib.h"
|
|
|
|
|
#include <sys/mman.h>
|
|
|
|
|
|
|
|
|
|
#define MAX_CHUNK_SIZE 2048*2048
|
|
|
|
|
|
|
|
|
@ -27,7 +28,8 @@ bool inside_buffer(chunk_array_t* chunk_array,int init_pos, size_t pos) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void chunk_array_free(chunk_array_t* chunk_array) {
|
|
|
|
|
fclose(chunk_array->fp);
|
|
|
|
|
//fclose(chunk_array->fp);
|
|
|
|
|
munmap(chunk_array->mmap_array, chunk_array->total_size * sizeof(double));
|
|
|
|
|
buffer_free(chunk_array->buffer1);
|
|
|
|
|
buffer_free(chunk_array->buffer2);
|
|
|
|
|
free(chunk_array);
|
|
|
|
@ -41,8 +43,10 @@ void chunk_array_flush(chunk_array_t* chunk_array) {
|
|
|
|
|
void buffer_flush(chunk_array_t* chunk_array, buffer_t* buffer) {
|
|
|
|
|
if (buffer->dirty) {
|
|
|
|
|
int mod = get_mod(chunk_array, buffer->init_pos);
|
|
|
|
|
fseek(chunk_array->fp, buffer->init_pos * sizeof(double), SEEK_SET);
|
|
|
|
|
fwrite(buffer->data, sizeof(double), mod, chunk_array->fp);
|
|
|
|
|
//fseek(chunk_array->fp, buffer->init_pos * sizeof(double), SEEK_SET);
|
|
|
|
|
//fwrite(buffer->data, sizeof(double), mod, chunk_array->fp);
|
|
|
|
|
memcpy(&chunk_array->mmap_array[buffer->init_pos], buffer->data, mod * sizeof(double));
|
|
|
|
|
|
|
|
|
|
buffer->dirty = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -53,9 +57,11 @@ void buffer_update(chunk_array_t* chunk_array, buffer_t* buffer, size_t pos) {
|
|
|
|
|
|
|
|
|
|
int new_init = pos/chunk_array->chunk_size;
|
|
|
|
|
buffer->init_pos = new_init * chunk_array->chunk_size;
|
|
|
|
|
int mod = get_mod(chunk_array, buffer->init_pos);
|
|
|
|
|
|
|
|
|
|
fseek(chunk_array->fp, buffer->init_pos * sizeof(double), SEEK_SET);
|
|
|
|
|
fread(buffer->data, sizeof(double), chunk_array->chunk_size, chunk_array->fp);
|
|
|
|
|
//fseek(chunk_array->fp, buffer->init_pos * sizeof(double), SEEK_SET);
|
|
|
|
|
//fread(buffer->data, sizeof(double), chunk_array->chunk_size, chunk_array->fp);
|
|
|
|
|
memcpy(buffer->data, &chunk_array->mmap_array[buffer->init_pos], mod * sizeof(double));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
buffer_t* buffer_create(int size) {
|
|
|
|
@ -83,14 +89,15 @@ void buffer_free(buffer_t* buffer) {
|
|
|
|
|
|
|
|
|
|
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) {
|
|
|
|
|
if (chunk_array == NULL) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
chunk_array->mmap_array = mmap ( NULL, total_size*sizeof(double), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0 );
|
|
|
|
|
|
|
|
|
|
if (chunk_array->mmap_array == NULL) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
chunk_array->chunk_size = min(MAX_CHUNK_SIZE, total_size);
|
|
|
|
@ -106,17 +113,19 @@ chunk_array_t* chunk_array_create(char* filename, size_t total_size) {
|
|
|
|
|
chunk_array->buffer2 = buffer_create(chunk_array->chunk_size);
|
|
|
|
|
|
|
|
|
|
if (chunk_array->buffer2 == NULL) {
|
|
|
|
|
fclose(chunk_array->fp);
|
|
|
|
|
//fclose(chunk_array->fp);
|
|
|
|
|
buffer_free(chunk_array->buffer1);
|
|
|
|
|
free(chunk_array);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fread(chunk_array->buffer1->data, sizeof(double), chunk_array->chunk_size, chunk_array->fp);
|
|
|
|
|
memcpy(chunk_array->buffer1->data, chunk_array->mmap_array, chunk_array->chunk_size * sizeof(double));
|
|
|
|
|
chunk_array->buffer1->init_pos = 0;
|
|
|
|
|
fread(chunk_array->buffer2->data, sizeof(double), chunk_array->chunk_size, chunk_array->fp);
|
|
|
|
|
if (total_size > chunk_array->chunk_size) {
|
|
|
|
|
int mod = get_mod(chunk_array, chunk_array->buffer1->init_pos + chunk_array->chunk_size);
|
|
|
|
|
memcpy(chunk_array->buffer2->data, &chunk_array->mmap_array[chunk_array->chunk_size], mod * sizeof(double));
|
|
|
|
|
chunk_array->buffer2->init_pos = chunk_array->chunk_size;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
chunk_array->filename = filename;
|
|
|
|
|
chunk_array->total_size = total_size;
|
|
|
|
|
return chunk_array;
|
|
|
|
|