为了减少这个响应时间,我尝试将我的数据库迁移到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’
对于演示文稿抱歉,我不知道如何制作数组.
解决方法
对于MysqL,我听到你在说什么.我发现MysqL的连接效率非常低.我看起来像我的全表扫描,如果没有他们可以离开我.我记得MysqL花了一分钟的时间查询Oracle将需要不到一秒钟的时间.也许尝试Postgresql?我不知道是否更好.
另一种方法可能是让数据库为您分配数据,以便您可以在没有哈希值的情况下进行扫描.
除非你的记录是古怪的,否则100M记录不应该那么糟糕.