我有一个项目,我必须提高其性能.我有一个巨大的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记录不应该那么糟糕.

c – 从CSV文件加速处理的更多相关文章

  1. ios – 如何从Core Data创建CSV文件(swift)

    我正在构建一个带有核心数据的应用程序,它们显示在tableView中.现在我想将这些数据导出到CSV文件,这样我就可以在windows上的excel中打开它.我搜索了很多,但没有找到正确的答案.有人可以帮助我或给我一个良好的解释或教程的链接?

  2. swift 3.1如何从CSV获取数组或字典

    我怎样才能在这种CSV文件中使用数据?或者我如何打印“内部”列的第2行值并将其分配给属性/实体?我有这种从excel文件转换为Numbers的文件,我想抓取每列的数据并使用它们.原始CSV文件以数字打开:我得到的控制台输出:使用这种方法:解决方案感谢JensMeder运用在viewDidLoad中你想要做的是将字符串分成行然后分成列.Swift已经为String结构提供了components方法.然后您可以通过以下方式访问任何值

  3. 数组 – 将.csv数据导入数组

    我在过去几年使用Objective-C.现在我正在尝试Xcode6beta4与迅速.我想导入一个.csv表单我的webserver到一个数组.我在Objective-C中的旧代码是:我怎么可以在Swift这样做?有最佳做法–推荐吗?有多个swift库可用:CSVImporter,它是一个适用于处理大型csv文件的异步解析器.SwiftCSV,它是一个用于OSX和iOS的简单CSV解析库.和CSwiftV,它是符合rfc4180规范的csv解析器,但根据作者,它全部在内存中,因此不适合大文件.

  4. 读取资源文件夹android中的CSV文件

    我正在开发netbeans的Android应用程序.我正在尝试使用opencsv读取CSV文件.当我将文件放在资源文件夹中并尝试从那里读取它时,在构建无效资源目录时出错.我应该在哪里存储csv文件,以便每次应用程序启动时都可以读取它?

  5. 是否可以远程托管Android应用程序中使用的资源,使其只能由我的应用程序使用?

    基本上我想要实现的是托管一个CSV文件,我的应用程序将检索并使用该文件作为填充某些表的数据源.CSV将使用最新数据进行更新,我设想应用程序每隔一段时间就会获得最新版本,以确保其中的数据是最新的.我的问题在于是否可以确保此远程CSV资源仅供我的应用程序使用?有没有其他方法可以确保我的csv数据源仅供我的应用程序使用?

  6. python 读写csv文件方式(创建,追加,覆盖)

    这篇文章主要介绍了python 读写csv文件方式(创建,追加,覆盖),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. python保存字典数据到csv文件的完整代码

    在实际数据分析过程中,我们分析用Python来处理数据(海量的数据),我们都是把这个数据转换为Python的对象的,比如最为常见的字典,下面这篇文章主要给大家介绍了关于python保存字典数据到csv的相关资料,需要的朋友可以参考下

  8. Python读取CSV文件并进行数据可视化绘图

    这篇文章主要介绍了Python读取CSV文件并进行数据可视化绘图,文章围绕主题基于Python展开CSV文件读取的详细内容介绍,感兴趣的小伙伴可以参考一下

  9. Pandas对CSV文件读写操作详解

    本文带你了解CSV文件的基础知识,那么当需要处理导入数据时,大多数 CSV 读取、处理和写入任务都可以通过基本的 Python csv 库轻松处理。如果大量数据要读取和处理,该pandas库还提供快速简便的 CSV 处理功能

  10. 一文搞懂Python读取text,CSV,JSON文件的方法

    文件处理是一种用于创建文件、写入数据和从中读取数据的过程,Python 拥有丰富的用于处理不同文件类型的包,从而使得我们可以更加轻松方便的完成文件处理的工作,本文将来为大家详细讲讲

随机推荐

  1. 从C到C#的zlib(如何将byte []转换为流并将流转换为byte [])

    我的任务是使用zlib解压缩数据包(已接收),然后使用算法从数据中生成图片好消息是我在C中有代码,但任务是在C#中完成C我正在尝试使用zlib.NET,但所有演示都有该代码进行解压缩(C#)我的问题:我不想在解压缩后保存文件,因为我必须使用C代码中显示的算法.如何将byte[]数组转换为类似于C#zlib代码中的流来解压缩数据然后如何将流转换回字节数组?

  2. 为什么C标准使用不确定的变量未定义?

    垃圾价值存储在哪里,为什么目的?解决方法由于效率原因,C选择不将变量初始化为某些自动值.为了初始化这些数据,必须添加指令.以下是一个例子:产生:虽然这段代码:产生:你可以看到,一个完整的额外的指令用来移动1到x.这对于嵌入式系统来说至关重要.

  3. 如何使用命名管道从c调用WCF方法?

    更新:通过协议here,我无法弄清楚未知的信封记录.我在网上找不到任何例子.原版的:我有以下WCF服务我输出添加5行,所以我知道服务器是否处理了请求与否.我有一个.NET客户端,我曾经测试这一切,一切正常工作预期.现在我想为这个做一个非托管的C客户端.我想出了如何得到管道的名称,并写信给它.我从here下载了协议我可以写信给管道,但我看不懂.每当我尝试读取它,我得到一个ERROR_broKEN_P

  4. “这”是否保证指向C中的对象的开始?

    我想使用fwrite将一个对象写入顺序文件.班级就像当我将一个对象写入文件时.我正在游荡,我可以使用fwrite(this,sizeof(int),2,fo)写入前两个整数.问题是:这是否保证指向对象数据的开始,即使对象的最开始可能存在虚拟表.所以上面的操作是安全的.解决方法这提供了对象的地址,这不一定是第一个成员的地址.唯一的例外是所谓的标准布局类型.从C11标准:(9.2/20)Apointe

  5. c – 编译单元之间共享的全局const对象

    当我声明并初始化一个const对象时.两个cpp文件包含此标头.和当我构建解决方案时,没有链接错误,你会得到什么如果g_Const是一个非const基本类型!PrintInUnit1()和PrintInUnit2()表明在两个编译单元中有两个独立的“g_Const”具有不同的地址,为什么?

  6. 什么是C名称查找在这里? (&amp;GCC对吗?)

    为什么在第三个变体找到func,但是在实例化的时候,原始变体中不合格查找找不到func?解决方法一般规则是,任何不在模板定义上下文中的内容只能通过ADL来获取.换句话说,正常的不合格查找仅在模板定义上下文中执行.因为在定义中间语句时没有声明func,并且func不在与ns::type相关联的命名空间中,所以代码形式不正确.

  7. c – 在输出参数中使用auto

    有没有办法在这种情况下使用auto关键字:当然,不可能知道什么类型的.因此,解决方案应该是以某种方式将它们合并为一个句子.这可用吗?解决方法看起来您希望默认初始化给定函数期望作为参数的类型的对象.您无法使用auto执行此操作,但您可以编写一个特征来提取函数所需的类型,然后使用它来声明您的变量:然后你就像这样使用它:当然,只要你重载函数,这一切都会失败.

  8. 在C中说“推动一切浮动”的确定性方式

    鉴于我更喜欢将程序中的数字保留为int或任何内容,那么使用这些数字的浮点数等效的任意算术最方便的方法是什么?说,我有我想写通过将转换放在解析的运算符树叶中,无需将表达式转化为混乱是否可以使用C风格的宏?应该用新的类和重载操作符完成吗?解决方法这是一个非常复杂的表达.更好地给它一个名字:现在当您使用整数参数调用它时,由于参数的类型为double,因此使用常规的算术转换将参数转换为double用C11lambda……

  9. objective-c – 如何获取未知大小的NSArray的第一个X元素?

    在objectiveC中,我有一个NSArray,我们称之为NSArray*largeArray,我想要获得一个新的NSArray*smallArray,只有第一个x对象…

  10. c – Setprecision是混乱

    我只是想问一下setprecision,因为我有点困惑.这里是代码:其中x=以下:方程的左边是x的值.1.105=1.10应为1.111.115=1.11应为1.121.125=1.12应为1.131.135=1.14是正确的1.145=1.15也正确但如果x是:2.115=2.12是正确的2.125=2.12应为2.13所以为什么在一定的价值是正确的,但有时是错误的?请启发我谢谢解决方法没有理由期望使用浮点系统可以正确地表示您的帖子中的任何常量.因此,一旦将它们存储在一个双变量中,那么你所拥有的确切的一

返回
顶部