對於我已經提交的大學練習,我需要閱讀包含大量圖像名稱(每行1個)的.txt文件。 然後,我需要打開每個圖像作爲ASCII文件,並閱讀他們的數據(以ppm格式圖像),並與他們做一系列的事情。 事情是,我注意到我的程序在讀取文件部分的數據時花費了70%的時間,而不是在我正在做的其他計算中(使用散列表查找每個像素的重複次數,找到不同的像素之間的2圖像等..),我覺得很奇怪,至少可以說。從大量ASCII文件中讀取數據的最快方法
這是PPM格式的樣子:
P3 //This value can be ignored when reading the file, because all image will be correctly formatted
4 4
255 //This value can be also ignored, will be always 255.
0 0 0 0 0 0 0 0 0 15 0 15
0 0 0 0 15 7 0 0 0 0 0 0
0 0 0 0 0 0 0 15 7 0 0 0
15 0 15 0 0 0 0 0 0 0 0 0
這是我是如何從文件中讀取數據:
ifstream fdatos;
fdatos.open(argv[1]); //Open file with the name of all the images
const int size = 128;
char file[size]; //Where I'll get the image name
Image *img;
while (fdatos >> file) { //While there's still images anmes left, continue
ifstream fimagen;
fimagen.open(file); //Open image file
img = new Image(fimagen); //Create new image object with it's data file
………
//Rest of the calculations whith that image
………
delete img; //Delete image object after done
fimagen.close(); //Close image file after done
}
fdatos.close();
和圖像目標讀取裏面像這樣的數據:
const int tallafirma = 100;
char firma[tallafirma];
fich_in >> std::setw(100) >> firma; // Read the P3 part, can be ignored
int maxvalue, numpixels;
fich_in >> height >> width >> maxvalue; // Read the next three values
numpixels = height*width;
datos = new Pixel[numpixels];
int r,g,b; //Don't need to be ints, max value is 256, so an unsigned char would be ok.
for (int i=0; i<numpixels; i++) {
fich_in >> r >> g >> b;
datos[i] = Pixel(r, g ,b);
}
//This last part is the slow one,
//I thing I should be able to read all this data in one single read
//to buffer or something which would be stored in an array of unsigned chars,
//and then I'd only need to to do:
//buffer[0] -> //Pixel 1 - Red data
//buffer[1] -> //Pixel 1 - Green data
//buffer[2] -> //Pixel 1 - Blue data
那麼,有什麼想法?我想我可以在一次調用中將它完全改進爲一個數組,我只是不知道這是如何完成的。
另外,知道「索引文件」中有多少圖像是可行的嗎?知道文件的行數是否可行?(因爲每行有一個文件名..)
謝謝!
編輯:這是我如何emasure時間。
#include <sys/time.h>
#include <sys/resource.h>
double get_time()
{
struct timeval t;
struct timezone tzp;
gettimeofday(&t, &tzp);
return t.tv_sec + t.tv_usec*1e-6;
}
double start = get_time();
//Everything to be measured here.
double end = get_time();
cout << end-start << endl;
嗯,我是這個學科的講座之一,也是這個學生參加的編程比賽的組織者。隨時可以幫助他,但假設學生必須自己解決比賽,或者只是閱讀不同的節目源,而不是使用積極的查詢來社區。 無論如何,正如我檢測到這個查詢,任何其他參與者可以,並且該副本完全禁止........ – 2011-03-06 10:11:10