c – 从CSV文件加速处理

前端之家收集整理的这篇文章主要介绍了c – 从CSV文件加速处理前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个项目,我必须提高其性能.我有一个巨大的MysqL数据库,由一个巨大的CSV文件(1亿行)构成.插入时间不是问题,但是请求的响应时间非常重要,有时候2次加入的查询大约需要20个小时…

为了减少这个响应时间,我尝试将我的数据库迁移到Cassandra,但没有成功:我的数据模型不适用于Cassandra概念.然后我想尝试另一种方式来提高性能:并行Virutal文件系统.而是在MysqL数据库中插入数据并发送然后发送查询,我尝试使用多线程读取整个csv文件,并进行了我的计算.但结果不好:只有1万000行的2m20s.

目前,我的计算非常简单:在C中使用MPI-IO API,我只计算2列的不同对值的数量.为了实现该计算,我使用一个hashmap,其中每个键都是来自csv文件的一对值.最后,我返回hashmap大小.
这里有一个小代码

MPI::Init(argc,argv); 
 cout << " INFO init done" << endl;
 int myrank = MPI::COMM_WORLD.Get_rank(); 
 int numprocs = MPI::COMM_WORLD.Get_size(); 
 get_filename(path_name,myrank);
 cout << " INFO open file : " << path_name << endl;
 MPI::File thefile = MPI::File::Open(MPI::COMM_WORLD,path_name.c_str(),MPI::MODE_RDONLY,MPI::INFO_NULL); 
 MPI::Offset offset = 101;
 MPI::Offset limit = thefile.Get_size();
 cout << " INFO go computing" << endl;
 do {
   thefile.Read_at(offset,buf,bufsize,MPI_CHAR,status);
   temp.assign(buf);
   Tokenize(temp,tokens,"\n");
   line.assign(tokens.at(0));
   tokens.clear();

   Tokenize(line,"\t");
   nidt_count(tokens);
   tokens.clear();
   offset += (line.size() + 1);
 }while(offset < limit);
 count = status.Get_count(MPI_INT);
 cout << "process " << myrank << " reads " << nidt_hash.size() << " nidt" << endl;

我在一个4核心的服务器上工作,8GB的RAM.我的数据是安装在我的服务器上的NFS或Samba中的NAS.我可以添加2或3个服务器进行处理,但是目前我只是在一个服务器上尝试一个小文件(100万行)来衡量性能.

最后我的问题是:

>为了我的问题,是否考虑改变PVFS类的好方法?我想说,我将使用更复杂的查询进行处理,例如:选择具有特定日期(范围小时)的所有行,以及特定列的特定对值.
>你知道其他可以帮助我改进csv文件处理的东西吗?我正在考虑使用Hadoop,Pytables或FasterCSV.

这里是由2个csv文件组成的我的数据示例:

最大的一个(100万行)组成如下:

ID        DATE             NUM_1        NUM_2     NB_UNITE TYPUNIT CODE_1 CODE_2

0  2007-05-13 15:37:48  33671624244  33698802900    547      s       0      17
0  2007-05-13 15:52:22  33671624244  33672211799      5      s       0      17 
....

第二个更简单和更小(90 000),它就像一个字典,从一个code_1和code_2我得到一个名为CODEVAL的值:

CODE_1 CODE_2 CODEVAL

  0       17     VS
  0       34     SS

如你所料,通常我为每个文件创建一个表,一个典型的查询是:

Select CODEVAL,hour(date) AS HEURE,COUNT(*) AS NBSMSSOR 
From Tables_1 Join CODEVAL using(CODE_1,CODE_2) 
Where CODEVAL='SS'

对于演示文稿抱歉,我不知道如何制作数组.

这里是由2个csv文件组成的我的数据示例:

>最大的一个(100万行)组成如下:

ID DATE NUM_1 NUM_2 NB_UNITE TYPUNIT CODE_1 CODE_2

0 2007-05-13 15:37:48 33671624244 33698802900 547 s 0 17
0 2007-05-13 15:52:22 33671624244 33672211799 5 s 0 17 ….
>第二个更简单和更小(90 000),从code_1和code_2我得到一个名为CODEVAL的值:

CODE_1 CODE_2 CODEVAL

0 17 VS

0 34 SS

如你所料,一个典型的查询是:

>选择CODEVAL,小时(日期)AS HEURE,COUNT(*)AS NBSMSSOR
来自Tables_1
使用(CODE_1,CODE_2)加入CODEVAL
其中CODEVAL =’SS’

对于演示文稿抱歉,我不知道如何制作数组.

解决方法

它看起来像我是I / O绑定.这并不能帮助您的数据通过网络.我怀疑如果你只是添加更多的机器,那么你的性能会下降,因为额外的争用.请记住,仍然只有一个主轴,只有一个HD主机读取您的数据.对于MPI解决方案,我建议制作多份数据,并将它们放在服务器上.

对于MysqL,我听到你在说什么.我发现MysqL的连接效率非常低.我看起来像我的全表扫描,如果没有他们可以离开我.我记得MysqL花了一分钟的时间查询Oracle将需要不到一秒钟的时间.也许尝试Postgresql?我不知道是否更好.
另一种方法可能是让数据库为您分配数据,以便您可以在没有哈希值的情况下进行扫描.

除非你的记录是古怪的,否则100M记录不应该那么糟糕.

原文链接:https://www.f2er.com/c/114347.html

猜你在找的C&C++相关文章