不知道“行”是一个什么概念,猜测大概是指CSV文件中的行?假设如此,那么百万行实际对应的就是百万条数据,按照平均每条数据100字节(相当高估的数值)来估算,也就是总计100MB数据量。这个数据量是什么概念呢?一块普通机械磁盘的读取速度大概有80~100MB/S,就是说一两秒之内就能读取完全部数据。如果你做的计算仅仅是一些简单的查询或是加减乘除(比如Moving Average),CPU的速度会远远快于硬盘访问,既是说在一台普通的个人电脑上,应该在几秒内就能完成计算任务。这个数字是头脑中应该有的正确的估算。有了这个概念,我们再来看看问题该如何解决。
首先,CSV格式是一个很差的存储格式。CSV按行存储,每读入一行都要按照分隔符进行拆分。它的数据全部以文本形式存储,意味着每读入一个浮点数比如1.234就要进行字符串到数字的转换。这些都是完全不必要的开销,会大大增加任务的处理时间。
其次,有人建议把数据导入到SQL数据库,这也是个坏主意。SQL数据库的确可以提供一些遍历的查询和索引,但是每次访问数据库都需要进行进程间通信,如果你需要逐条访问,这个通信时间也会非常昂贵,远远超出真正计算所需要的时间。
简言之,以上两种方案里你的大部分时间都浪费在无意义的I/O上,计算机的使用效率非常低。
下面给出几种方案建议,可以根据个人情况选择:
一,使用内存数据库(如KDB),百万条数据导入内存数据库也不过100MB左右的内存占用,毫无压力。在此基础上使用系统支持的语言(比如KDB中的Q)进行算法开发。这是quant界比较常见的一种方案,应该有成熟社区,容易找到帮助,如果你所在的机构正好有这方面的技术积累,就更方便了。缺点在于,数学计算比较受限于系统,如果你用到一些系统没提供的算法,开发成本比较大。KDB的语言本身需要陡峭的学习曲线,甚至很多方面可能非常晦涩,比如一个 ! 就可以根据上下文不同表示多种不同的操作符,从取模到生成列表,对于新手来说入门可能有些困难。
二,python神器:ipython+pandas。ipython提供一整套的类似matlab的计算环境,包含了丰富的数学函数和画图工具,示例可参见http://nbviewer.ipython.org。pandas则是专门针对金融类计算设计开发的计算库(Python Data Analysis Library),底层使用HDF5格式(一种高效的数据存储格式,对于金融时间序列来说远远优于CSV),上层提供很多强大的内建函数(统计类的mean,stddev,类SQL的group by,order by等等),而且本身工作在python环境里,可以直接使用python做编程方面的工作。更值得一提的是HDF5也是matlab支持的存储格式,所以有必要的时候可以无缝迁移到matlab(如果正好有某个算法是matlab提供而python没有的)。需要强调的是python在科学计算方面有巨大的优势,是统治级的语言,像并行计算,GPU之类都有很好的支持,不用担心要自己搭框架。
三,其他备选的还有如下一些:
The Julia Language 一个比较新的计算语言,介绍里强调了高性能,具体用起来怎么样不清楚所以不评价。
Java/Scala,java本身代表巨大的社区支持(丰富的第三方库,文档,优秀的开发环境),scala则提供强大的开发能力,以及像Apache Spark™这样的大数据处理利器 。java系在各种数学软件比如Matlab,Mathematica,R都可以直接内嵌,所以可以结合java在数据处理上的性能优势和数学软件的数学功能来一起使用。
上述任何一条方案都有非常不错的发展空间,相对而言题主的问题本身非常简单,肯定都可以胜任。具体选择哪个方案最好还是自己把相关资料通读一遍,有一个初步认识以后再结合自身情况选择。
— 完 —
本文作者:董可人
【知乎日报】
你都看到这啦,快来点我嘛 Σ(▼□▼メ)
此问题还有 14 个回答,查看全部。
延伸阅读:
在数据分析、挖掘方面,有哪些好书值得推荐?
数据分析/挖掘工作的疑惑?