Recently, I encounter a tough question.
我必须逐行阅读许多巨大的gz文件(20多个文件,总大小200G)。我为每个文件启动一个线程,因此总线程数为20+。 然后我选择使用gzgets函数在一个线程中解析它。在解决了总数据(200G gz)之后,它将花费20多个小时。
我需要加快gz文件的读取速度。 关键代码如下:
1 \#define BUF_4_GZ (128*1024)
2 char * line;
3 char * read_buf;
4 gzFile gzfile = gzopen("*.gz", "r")
5 setvbuf(gzfile, NULL, _IOFBF, BUF_4_GZ);
6 while ( (line = gzgets(ifp, read_buf, 1024))) {
7 // resolve each line
8 }
显然瓶颈是磁盘io。而现在我需要找到一种方法来做一些表现。 我想我可以通过调整gz uncompress算法的缓冲区来加速这个过程。所以我多次尝试将BUF_4_GZ的值从128K调整到256K和512K,但事实证明总时间从未改变过,这让我很困惑。
Q1:第5个代码 - setvbuf不能影响第6个代码吗?
Q2:你们有没有其他办法让这个过程更快?
问题3:你们有没有提出一些建议来监控solaris中的磁盘io?(iostat除外)