`
- 浏览:
92695 次
- 性别:
- 来自:
上海
-
转载
http://www.cnblogs.com/MicroTeam/archive/2010/12/03/1895071.html
在这个云计算热炒的时代,如果你没有处理过海量数据的话,你将不再是个合格的Coder。现在赶紧补补吧~
前一阵子分析了一个将近1TB的数据群(gz文件,压缩10%)。因为第一次分析如此巨大的数据,没有经验,所以浪费了许多时间。下面是我整理的一些经验,方便后者。
欢迎各种补充,我会不断更新这篇文章;觉得有用的话,速度分享链接;有不同意见的话,请果断拍砖;
下载数据
Q:怎么自动下载多个文件?
这是我遇到的第一个问题。当数据量很大时,一般都会分成很多个文件存放。这时下载文件比较麻烦。
A:用Wget命令。Windows下花费一点时间去下载安装。但之于手动下载,能省不少时间。
我提供两种方式方式下载文件,
a)用Wget的递归下载选项 “-r”。一般命令如下
wget –r http://<下载数据的根目录>/ -o <下载记录文件名> -np
因为递归下载没法控制进度,所以建议不一要次递归下载太多的文件
b)用Bat+Wget,多次执行Wget。一般命令如下
wget –r http://<下载数据的根目录分支1>/ -o <下载记录文件名> -np
wget –r http://<下载数据的根目录分支2>/ -o <下载记录文件名> -np
wget –r http://<下载数据的根目录分支3>/ -o <下载记录文件名> -np
…… ……
wget –r http://<下载数据的根目录分支N>/ -o <下载记录文件名> -np
用Bat可以降低出错带来的影响。
另外,Wget可以通过 –A 选项来指定希望下载的文件的后辍,通过 –P 选项来指定下载文件存放路径。更多命令,参见wget -h
Q:这速度。。。什么时候才能下完?
网速永远是个瓶颈
A:如果下载服务很远的话,你应该考虑代理。wget设置代理的方式如下
set http_proxy=http://<代理服务器>
不要忘了多开几个进程,20个试试?
打开文件
Q:怎么打开文本文件
这不是弱智问题。你用记事本打开一个100MB的文件试试
A:LTF viewer
Large Text File viewer, 打开速度会让你惊奇
Q:怎么打开二进制文件
A:Hex Editor Neo
你可以通过下面方式来选择进制:
右击数据区 => Display As => Hex|Decimal|Octal|Binary|Float|Double
你可以通过下面方式来选择按多少字节显示:
右击数据区 => Group By => Bytes|Words|Double|Quad
编程语言
当数据量很大时,选择语言要慎重了。因为不同语言有不同的特点,你要在编程时间和运行时间之间权衡。
模型测试
开始时,一般挑几个小的数据进行测试,获取第一份分析结果。这时当然希望能快速编程实现。脚本语言是一个很好的选择,比如Python。
大量处理
开始遍历处理所有数据时,用脚本语言来处理就不太合适了。因为脚本语言的运行时间不能让人接受。另外,还有内存使用,文件读写这些你都没法控制。不幸的是,很少语言会为你处理海量文件做优化。
这时,C/C++是最好的选择。
结果展示
漫长的等待终于过去了,眼看就要出结果了。如果你还执着于陪伴你度过漫长等待的C/C++的话,你迟早会沮丧的。
我尝试了很多方式之后,得出的结论是,让Matlab来接手C/C++。Matlab能轻而易举地展示大量数据。更重要的是Matlab支持读取二进制文件。
filename = 'out.bin'; % binary file
fid = fopen( filename );
data = fread( fid, itemsNumber, '*uint32');
fclose(fid);
算法
一次性读文件
我已经测试过好几次了,一次性读取文件比一行一行读文件至少快五倍
记住O(N)
这时你要好好考虑算法的复杂度了。任何O(N2)的算法都不可取。
必要的时候可以通过空间来换时间。通常哈希表能节省不少时间。
并行处理
温习一下并行算法。这比等待单线程程序好很多。
可以考虑在GPU上跑程序。当然,内存和文件读取时间更可能是瓶颈。
内存、CPU、磁盘读取速度,谁是瓶颈,任务管理器知道。
优化核心代码
通常80%的时间在运行20%的代码。所以有空的话优化下经常经常执行的代码。
分布式保存
把分析结果存在一个文件中是一个很糟糕的决定。这会为后面处理带来很多麻烦。比如并行处理,文件过大等。
二进制方式保存中间数据
二进制方式存放通常能省一半的磁盘空间。这同时意味着减少一半的写硬盘时间和读硬盘时间。当然,还有文本转换时间。
还有个重要细节要注意:在Windows中,读写文件的方式要改成”rb”和”wb”。要不然莫名的Bug迟早要发生,但不一定能找到。
运行
Debug Vs Release
别忘了,最终运行时把编译方式换成Release。但是刚改完程序的话,建议先用Debug模式试跑一下。这样能定位运行时异常。
批处理
批处理是降低运行出错风险的很好的方式。因为你不确定程序能正常结束。所以一段一段执行程序是一个很好的选择。如果某个地主出问题的话就不用重新运行前面的程序了。
断言
当数据量很大时,很难保证输入是合法的。另一种情况是,数据是合法的,但我们欠考虑了。这时断言就显得很重要了。断言回增加运行时间,但总比花大量时间得到一个错误结果好。
记录运行结果到文件
前面提到,数据量很大时,很难保证程序正常结束。一般,很少人会坐在显示器旁监视输出结果。把运行情况定时记录到文件是非常必要的。
另外,不要忘了fclose();
附:64位编程问题
数据量很大时,内存通常是不够用的。有一个常识必须知道:32位程序的最大寻址空间是2GB。如果你要分配接近或者超过2G内存的话,试试64位程序吧。当然有两条件:64位的CPU,64位的操作系统。
下面是编写64位程序的一些经验
编译环境
如果是解释型语言,比如Python,则需要下载一个64位的Python解释器
如果是编译型语言,比如C/C++,则需要选择恰当的编译平台。
比如VS2010中,项目属性 => Configuration Manager => Platform => New => X64
[img][/img]
内存
分配大数组,应该用malloc,而不是直接定义数组。
sizeof( int ) != sizeof( size_t )
64位程序中,数组下标应该换成size_t,常数也需要强制转换,比如 4GB = 4*(size_t)1000000000000
文件
fwrite一次性写入一个大于4GB的数组似乎有些问题。
分多次写入文件试试。
就写到这了,很晚了。。。
欢迎各种补充,我会不断更新这篇文章;觉得有用的话,速度分享链接;有不同意见的话,果断拍砖
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
2022年最新高质量java程序员简历-22篇2022年最新高质量java程序员简历-22篇2022年最新高质量java程序员简历-22篇2022年最新高质量java程序员简历-22篇2022年最新高质量java程序员简历-22篇2022年最新高质量java...
简历模板-程序员-通用-精选简历模板-程序员-通用-精选简历模板-程序员-通用-精选简历模板-程序员-通用-精选简历模板-程序员-通用-精选简历模板-程序员-通用-精选简历模板-程序员-通用-精选简历模板-程序员-通用-精选...
java程序员简历-14套(含高级工程师,项目经理,架构师等相关经验)java程序员简历-14套(含高级工程师,项目经理,架构师等相关经验)java程序员简历-14套(含高级工程师,项目经理,架构师等相关经验)java程序员...
【软考程序员09-18年真题.7z】是一个包含过去十年(2009年至2018年)的软件考试程序员级别试题的压缩文件。这个压缩包对于准备参加软考程序员考试的考生来说是极其宝贵的资源,因为它提供了大量实际考试题目,可以...
根据给定的信息,我们可以总结出以下相关知识点,这些知识点主要围绕新入行程序员应该了解的秘密进行阐述: ### 1. **选择与成长** - **关键点:** 选择一个适合自己的技术栈对于程序员的成长至关重要。 - **详细...
程序员法则----------------------------
程序员--月度绩效考核
程序员简历模板-软件工程师程序员简历模板-软件工程师程序员简历模板-软件工程师程序员简历模板-软件工程师程序员简历模板-软件工程师程序员简历模板-软件工程师程序员简历模板-软件工程师程序员简历模板-软件工程师...
JAVA程序员必读--基础篇.chm
《程序员指南--.Net》是一份综合性的学习资源,针对使用.NET框架进行软件开发的程序员。这份压缩包中包含了丰富的编程源码,旨在帮助开发者深入理解.NET平台的工作原理,提高编程技能,以及优化代码实践。 .NET是...
程序员必读---计算机专用英语词汇1500词.doc
程序员的AI必修课,AIGC全栈项目实战(AI前端后端测试运维) 课程内容 1_01 ChatGPT如何为程序员赋能-01.ChatGPT为程序员赋能-课程安排.mp4 2_01 ChatGPT如何为程序员赋能-02.ChatGPT为程序员赋能-ChatGPT背景介绍....
程序员2002- 10期
程序员2002- 4期
程序员2001- 09期
程序员2001- 08期
程序员2001- 10期
程序员2001- 07期
【标题】"程序员2001-02" 指的是2001年至2002年间出版的一系列关于程序员技术领域的专业期刊或杂志。这个时期的IT行业发展迅速,尤其是在互联网泡沫破灭后,技术和商业模式正在经历转型,对程序员的需求和技能要求也...
《软考初级程序员05-17年真题解析与学习指南》 软考初级程序员考试,全称为全国计算机技术与软件专业技术资格(水平)考试初级程序员资格认证,是中国计算机和软件行业的一项重要资格考试。这个考试旨在评估考生在...