【问题标题】:mmap in python printing binary data instead of textpython中的mmap打印二进制数据而不是文本
【发布时间】:2017-06-19 05:02:50
【问题描述】:

我正在尝试逐字符读取 30 MB 的大文件。我发现了一篇关于如何读取大文件的有趣文章。 Fast Method to Stream Big files

问题:输出打印二进制数据而不是实际的人类可读文本

代码:

def getRow(filepath):
   offsets = get_offsets(filepath)
   random.shuffle(offsets)
   with gzip.open(filepath, "r+b") as f:
      i = 0
      mm = mmap.mmap(f.fileno(), 0, access = mmap.ACCESS_READ)
      for position in offsets:
          mm.seek(position)
          record = mm.readline()
          x = record.split(",")
          yield x


def get_offsets(input_filename):
   offsets = []
   with open(input_filename, 'r+b') as f:
       i = 0
       mm = mmap.mmap(f.fileno(), 0, access = mmap.ACCESS_READ)
       for record in iter(mm.readline, ''):
           loc = mm.tell()
           offsets.append(loc)
           i += 1
   return offsets

for line in getRow("hello.dat.gz"):
    print line

输出:输出产生了一些奇怪的二进制数据。

['w\xc1\xd9S\xabP8xy\x8f\xd8\xae\xe3\xd8b&\xb6"\xbeZ\xf3P\xdc\x19&H\\@\x8e\x83\x0b\x81?R\xb0\xf2\xb5\xc1\x88rJ\

我是不是在做一些非常愚蠢的事情?

编辑:

我发现了问题。这是因为gzip.open。不知道如何摆脱这个。有什么想法吗?

【问题讨论】:

    标签: python file gzip mmap bigdata


    【解决方案1】:

    根据GZipFile的文档:

    fileno(self)

    Invoke the underlying file object's `fileno()` method.
    

    您正在映射压缩的.gz 文件的视图,而不是压缩数据的视图。

    mmap() 只能对 OS 文件句柄进行操作,它不能映射任意 Python 文件对象。

    所以不,除非底层操作系统直接支持,否则您不能透明地映射压缩文件的解压缩视图。

    【讨论】:

    • 感谢您的意见。我正在尝试相应地修改我的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 2015-05-17
    • 1970-01-01
    • 2011-11-22
    • 2018-03-17
    • 1970-01-01
    相关资源
    最近更新 更多