|
|
|
@ -4,6 +4,11 @@
|
|
|
|
|
|
|
|
|
|
#define MAX_CHUNK_SIZE 2048*2048
|
|
|
|
|
|
|
|
|
|
int min(int value1, int value2) {
|
|
|
|
|
if (value1 < value2) return value1;
|
|
|
|
|
return value2;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int get_mod(chunk_array_t* chunk_array,int init_pos) {
|
|
|
|
|
int mod;
|
|
|
|
|
if (chunk_array->total_size - init_pos > chunk_array->chunk_size ) {
|
|
|
|
@ -50,12 +55,12 @@ void buffer_update(chunk_array_t* chunk_array, buffer_t* buffer, size_t pos) {
|
|
|
|
|
fread(buffer->data, sizeof(double), chunk_array->chunk_size, chunk_array->fp);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
buffer_t* buffer_create() {
|
|
|
|
|
buffer_t* buffer_create(int size) {
|
|
|
|
|
buffer_t * buffer = (buffer_t*)malloc(sizeof(buffer_t));
|
|
|
|
|
|
|
|
|
|
if (buffer == NULL) return NULL;
|
|
|
|
|
|
|
|
|
|
buffer->data = malloc(MAX_CHUNK_SIZE * sizeof(double));
|
|
|
|
|
buffer->data = malloc(size * sizeof(double));
|
|
|
|
|
|
|
|
|
|
if (buffer->data == NULL) {
|
|
|
|
|
free(buffer);
|
|
|
|
@ -84,7 +89,9 @@ chunk_array_t* chunk_array_create(char* filename, size_t total_size) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
chunk_array->buffer1 = buffer_create();
|
|
|
|
|
chunk_array->chunk_size = min(MAX_CHUNK_SIZE, total_size);
|
|
|
|
|
|
|
|
|
|
chunk_array->buffer1 = buffer_create(chunk_array->chunk_size);
|
|
|
|
|
|
|
|
|
|
if (chunk_array->buffer1 == NULL) {
|
|
|
|
|
fclose(chunk_array->fp);
|
|
|
|
@ -92,7 +99,7 @@ chunk_array_t* chunk_array_create(char* filename, size_t total_size) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
chunk_array->buffer2 = buffer_create();
|
|
|
|
|
chunk_array->buffer2 = buffer_create(chunk_array->chunk_size);
|
|
|
|
|
|
|
|
|
|
if (chunk_array->buffer2 == NULL) {
|
|
|
|
|
fclose(chunk_array->fp);
|
|
|
|
@ -101,13 +108,12 @@ chunk_array_t* chunk_array_create(char* filename, size_t total_size) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fread(chunk_array->buffer1->data, sizeof(double), MAX_CHUNK_SIZE, chunk_array->fp);
|
|
|
|
|
fread(chunk_array->buffer1->data, sizeof(double), chunk_array->chunk_size, chunk_array->fp);
|
|
|
|
|
chunk_array->buffer1->init_pos = 0;
|
|
|
|
|
fread(chunk_array->buffer2->data, sizeof(double), MAX_CHUNK_SIZE, chunk_array->fp);
|
|
|
|
|
chunk_array->buffer2->init_pos = MAX_CHUNK_SIZE;
|
|
|
|
|
fread(chunk_array->buffer2->data, sizeof(double), chunk_array->chunk_size, chunk_array->fp);
|
|
|
|
|
chunk_array->buffer2->init_pos = chunk_array->chunk_size;
|
|
|
|
|
|
|
|
|
|
chunk_array->filename = filename;
|
|
|
|
|
chunk_array->chunk_size = MAX_CHUNK_SIZE;
|
|
|
|
|
chunk_array->total_size = total_size;
|
|
|
|
|
return chunk_array;
|
|
|
|
|
}
|
|
|
|
|