嘗試使用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