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类的好方法?我想说,我将使用更复杂的查询进行处理,例如:选择具有特定日期(范围小时)的所有行,以及特定列的特定对值. 这里是由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 CODE_1 CODE_2 CODEVAL 0 17 VS 0 34 SS 如你所料,一个典型的查询是: >选择CODEVAL,小时(日期)AS HEURE,COUNT(*)AS NBSMSSOR 对于演示文稿抱歉,我不知道如何制作数组. 解决方法
它看起来像我是I / O绑定.这并不能帮助您的数据通过网络.我怀疑如果你只是添加更多的机器,那么你的性能会下降,因为额外的争用.请记住,仍然只有一个主轴,只有一个HD主机读取您的数据.对于MPI解决方案,我建议制作多份数据,并将它们放在服务器上.
对于MySQL,我听到你在说什么.我发现MySQL的连接效率非常低.我看起来像我的全表扫描,如果没有他们可以离开我.我记得MySQL花了一分钟的时间查询Oracle将需要不到一秒钟的时间.也许尝试PostgreSQL?我不知道是否更好. 除非你的记录是古怪的,否则100M记录不应该那么糟糕. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |