标签: 大数据

  • 造就数据科学家(转)

    结合自身的经历,从NLP开始,到在研究所做数据的TEI结构设计,再在欧盟DARIAH上介绍这个结构,以及目前手头在做的语义网,无一不是在和数据、结构打交道,始终困惑这应该属于什么类型的职位,看到这篇文章实在是帮我找到了一个位置,希望有相同困扰的朋友也看看。

    (更多…)

  • [大数据处理]Python直接操作压缩包里面的文件

    大数据处理中,常常会遇到压缩后的数据包,比如BZ2,ZIP等格式,这里简单的介绍了Python在无解压的情况下读取BZ2压缩文件,另外通过lxml中iterparse()的对于XML大型文件处理的方法。

    在处理维基百科的DUMP包的时候,会遇到一个问题:大数据,几乎每一个DUMP在解压后都有400-500GB,没有解压之前如果是BZ2格式的话,大小也在20-30GB之间。
    对于大数据的一般处理顺序:解压压缩包,再处理。可是把所有压缩包解压,可能没有足够的硬盘空间, 而且也很费时间。那么就试试不解压的情况下来操作,整个过程都在Python 2.7.*的环境下运行。

    BZ2文件:

    [python]
    #加载bz2模块
    from bz2 import BZ2File as b2f

    fp = b2f("filename.bz2") #filename.bz2是要处理的压缩包名字
    line = fp.readline() #读取一行
    while line: #按行读取,并自动读完的时候停止
    print line
    line = fp.readline()
    [/python]

    现在我们知道了如何在不解压的情况下处理bz2格式的文件,那么维基百科提供的DUMP都按照BZ2格式的压缩,而且里面的文件是XML文件,那么该如何处理维基百科的数据呢?
    Python提供了xml.sax来处理XML大型文件,而且这个处理方式完全可以和上面的方式联合来直接操作20几个GB的数据包。这里就介绍一下操作方式,下面这段SAX代码引子别处,并且在上面做了一些修改, 源代码网址:http://my.oschina.net/renhc/blog/59646

    [python]
    from bz2 import BZ2File as b2f #加载bz2模块
    from xml.sax import parse, handler, SAXException

    class MyXMLSAXHandler(handler.ContentHandler):
    """
    用户自定义事件处理器
    """
    #文档开始事件处理
    def startDocument(self):
    print ‘Document Start…’

    #文档结束事件处理
    def endDocument(self):
    print ‘Document End…’

    #元素开始事件处理
    #"name"是节点名称,"attrs"是节点属性
    def startElement(self, name, attrs):
    print ‘encounter element(%s)’ % (name)

    #元素结束事件处理
    def endElement(self, name):
    print ‘leave element(%s)’ % (name)
    #内容事件处理
    def characters(self, content):
    if content.isspace(): #去掉内容中的空格
    return
    print ‘characters:’ + content

    try:
    fp = b2f("filename.bz2","r") #filename.bz2是要处理的压缩包名字
    parse(fp, MyXMLSAXHandler())
    except SAXException, msg:
    print msg.getException()
    except:
    print sys.exc_info()[0],sys.exc_info()[1]
    [/python]
    这段代码其实不难理解,类MyXMLSAXHander继承了handler.ContentHandler, 在parse()分析XML文件是,从头到尾像流水一下的处理文件,类似与逐行读取,并在读取到相应的节点的时候,进行相关处理。
    也许通过xml.sax来控制数据还是比较复杂且花费时间,那么可以试试lxml中提供的iterparse(),这个方法基于SAX,操作大型数据就变的简单多了,类似的Python自身也提供了iterparse()模块, 有兴趣的可以移步:
    http://docs.python.org/2/library/xml.etree.elementtree.html#xml.etree.ElementTree.iterparse, 小提示:xml.etree.ElementTree和xml.etree.cElementTree都可以用哦,后者基于C的模块,速度会更快一些。 废话不多说,直接进入lxml.etree.iterparse()的用法,后面清除内存的那块一定得加。
    [python]
    from bz2 import BZ2File as b2f
    from lxml import etree

    f1 = "filename.xml.bz2"
    fp = b2f(f1,"r")
    node_find = "page" #要寻找的节点的名字

    #fp上面的传送过来的一个Objet, 其实也可以是一个文件名。
    #end是某个节点的结尾
    tree = etree.iterparse(fp,events=("end",), tag=node_find)
    for event, elem in tree:
    #输出结果
    print etree.tostring(elem, encoding="utf-8", pretty_print=True,
    xml_declaration=True)

    #清除内存
    elem.clear()
    while elem.getprevious() is not None:
    del elem.getparent()[0]
    [/python]

    好了,就到这里,如问题请留言。

  • IDC预测2015年大数据市场规模或达169亿美元

    北京时间3月8日早间消息,市场调研机构IDC周三发布一份报道,预测大数据(Big Data)市场将会进一步蓬勃发展。

    (更多…)