gpt4 book ai didi

c++ - 从大量 ASCII 文件中读取数据的最快方法

转载 作者:太空宇宙 更新时间:2023-11-04 12:21:12 26 4
gpt4 key购买 nike

对于我已经提交的大学练习,我需要阅读一个包含大量图像名称(每行 1 个)的 .txt 文件。然后我需要将每个图像作为 ascii 文件打开,并读取它们的数据(图像以 ppm 格式),并对它们进行一系列操作。事情是,我注意到我的程序花费了 70% 的时间从文件部分读取数据,而不是我正在做的其他计算(使用哈希表查找每个像素的重复次数,找到不同的两张图片之间的像素等),至少可以说我觉得这很奇怪。

这是 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

那么,有什么想法吗?我认为我可以在一次调用中将所有内容读取到一个数组中,从而大大改进它,我只是不知道它是如何完成的。

此外,是否可以知道“索引文件”中有多少张图片?是否可以知道一个文件的行数?(因为每一行有一个文件名..)

谢谢!!

编辑:这就是我计算时间的方式。

#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;

最佳答案

您在每个循环中分配内存并删除它。如果您如此关注性能,我认为那不是一件好事。

因此,您可以做的一项改进是:重新使用分配给您的程序的内存

void *memory = malloc(sizeof(Image)); //reusable memory. 

//placement new to construct the object in the already allocated memory!
img = new (memory) Image(fimagen);

//...

img->~Image(); //calling the destructor

//when you're done free the memory
free(memory); //use free, as we had used malloc when allocating!

同样,您可以在 Image 类中重用内存,尤其是在这一行:

 datos = new Pixel[numpixels];

最后,不是将 RGB 读入局部变量,然后将它们复制到图像数据中,这不是那么优雅,所以这里也可以做一点改进,

 //this is yours : temporaries, and copying!
fich_in >> r >> g >> b;
datos[i] = Pixel( r, g ,b);

//this is mine : no temporaries, no copying. directly reading into image data!
fich_in >> datos[i].r >> datos[i].g >> datos[i].b;

除此之外,我认为您的代码性能没有太大提升空间!

关于c++ - 从大量 ASCII 文件中读取数据的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4978812/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com