double read(const char * filename, std::streampos size, int n_files, int blocksize) { if (debug) printf("\n%d files: ", n_files); FILE * files[n_files]; // Open files, and set pos for (int i = 0; i<n_files; ++i) { files[i] = fopen ( filename, "rb" ); long int pos = (size/n_files)*i; fseek ( files[i], pos, SEEK_SET ); if (debug) printf("%lld, ", (unsigned long long) pos); } if (debug) printf("\n"); // Read size/n_files bytes from all files Benchmark t; t.start(); uint32_t * buffer = (uint32_t *) malloc(blocksize); // Every slice is 250' / number of files big for (uint32_t i=0; i<(size/n_files); i+=blocksize) { // should be unrolled? for (int j = 0; j<n_files; ++j) { // size_t res = fread(buffer, 1, blocksize, files[j] ); /* for (uint32_t z=0; z<blocksize/sizeof(int); ++z) { if (buffer[z] == 0) printf("Read first byte\n"); if (buffer[z] == 249999999) printf("Read last byte\n"); // fprintf(stderr, "Reading %d \n", buffer[z]); } //*/ } } t.stop(); // Close all files free(buffer); for (int i = 0; i<n_files; ++i) fclose(files[i]); return t.getSecs(); }
double random_read(const char * filename, std::streampos size, int blocksize) { FILE * file; file = fopen ( filename, "rb" ); if (debug) printf("\n"); // Read size/n_files bytes from all files Benchmark t; t.start(); uint32_t * buffer = (uint32_t *) malloc(blocksize); // Every slice is 250' / number of files big // for (uint32_t i=0; i<size; i+=blocksize) for (uint32_t i=0; i<=249999999; ++i) { long int pos = rand() % size; fseek ( file, pos, SEEK_SET ); // size_t res = fread(buffer, 1, blocksize, file ); /* for (uint32_t z=0; z<blocksize/sizeof(int); ++z) { if (buffer[z] == 0) printf("Read first byte\n"); if (buffer[z] == 249999999) printf("Read last byte\n"); // fprintf(stderr, "Reading %d \n", buffer[z]); } //*/ } t.stop(); // Close all files free(buffer); fclose(file); return t.getSecs(); }