尝试使用mmap,它会为您节省相当多的脱发。我感到快速,并以某种奇怪的心情回忆我的mmap知识,所以我写了一个简单的事情来让你开始。希望这可以帮助!
mmap的美妙之处在于它可以很容易地与OpenMP并行化。这也是预防I/O瓶颈的一个好方法。我首先定义Logfile类,然后再继续实现。
这里的头文件(logfile.h)
#ifndef _LOGFILE_H_
#define _LOGFILE_H_
#include <iostream>
#include <fcntl.h>
#include <stdio.h>
#include <string>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
using std::string;
class Logfile {
public:
Logfile(string title);
char* open();
unsigned int get_size() const;
string get_name() const;
bool close();
private:
string name;
char* start;
unsigned int size;
int file_descriptor;
};
#endif
而这里的.cpp文件。现在
#include <iostream>
#include "logfile.h"
using namespace std;
Logfile::Logfile(string name){
this->name = name;
start = NULL;
size = 0;
file_descriptor = -1;
}
char* Logfile::open(){
// get file size
struct stat st;
stat(title.c_str(), &st);
size = st.st_size;
// get file descriptor
file_descriptor = open(title.c_str(), O_RDONLY);
if(file_descriptor < 0){
cerr << "Error obtaining file descriptor for: " << title.c_str() << endl;
return NULL;
}
// memory map part
start = (char*) mmap(NULL, size, PROT_READ, MAP_SHARED, file_descriptor, 0);
if(start == NULL){
cerr << "Error memory-mapping the file\n";
close(file_descriptor);
return NULL;
}
return start;
}
unsigned int Logfile::get_size() const {
return size;
}
string Logfile::get_title() const {
return title;
}
bool Logfile::close(){
if(start == NULL){
cerr << "Error closing file. Was closetext() called without a matching opentext() ?\n";
return false;
}
// unmap memory and close file
bool ret = munmap(start, size) != -1 && close(file_descriptor) != -1;
start = NULL;
return ret;
}
,使用此代码,你可以使用OpenMP的工作份额,这些日志文件的解析,即
Logfile lf ("yourfile");
char * log = lf.open();
int size = (int) lf.get_size();
#pragma omp parallel shared(log, size) private(i)
{
#pragma omp for
for (i = 0 ; i < size ; i++) {
// do your routine
}
#pragma omp critical
// some methods that combine the thread results
}
这可能是一个IO界限操作,而不是任何事情,所以我不认为线程会在这里帮助任何事情。 – 2011-04-29 00:07:24
如果你有Mathematica,你可以写一些东西来做到这一点很快。 – 2011-04-29 00:29:51
难道你不认为只是将日志文件读入内存,并将字符串拆分为4或8个线程以便同时从内存中搜索它们会提高性能吗?这将是类似Map Reduce的方法,其中使用多个线程来完成内存映射数据的工作,但是您有分离的阶段来读取和处理数据。这样你就不必处理任何同步。 – netsky 2011-04-29 00:29:58