gpt4 book ai didi

c++ - 在巨大的日志文件中搜索数百种模式

转载 作者:行者123 更新时间:2023-11-30 04:34:42 26 4
gpt4 key购买 nike

我必须从网络服务器的 htdocs 目录中获取大量文件名,然后使用此文件名列表来搜索大量存档日志文件以查找对这些文件的最后访问。

我计划在 C++ 中使用 Boost 执行此操作。我会先获取最新的日志,然后向后阅读它,检查每一行我得到的所有文件名。

如果文件名匹配,我从 Logstring 中读取时间并保存它的最后一次访问。现在我不需要再寻找这个文件,因为我只想知道上次访问。

要搜索的文件名 vector 应该会迅速减少。

我想知道如何使用多线程最有效地处理此类问题。

我是否对日志文件进行分区并让每个线程从内存中搜索一部分日志,如果线程有匹配项,它会从文件名 vector 中删除该文件名,还是有更有效的方法来执行此操作?

最佳答案

尝试使用 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
}

关于c++ - 在巨大的日志文件中搜索数百种模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5826423/

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