【发布时间】:2016-03-25 23:29:07
【问题描述】:
Memory mapped file 是使用正则表达式或对大型二进制文件进行操作的有效方法。
如果我有一个大文本文件 (~1GB),是否可以使用编码感知映射文件?
像[\u1234-\u5678] 这样的正则表达式不适用于bytes 对象,并且将模式转换为unicode 也不起作用(例如"[\u1234-\u5678]".encode("utf-32") 无法正确理解范围)。
如果我使用.encode() 将搜索模式从str 转换为bytes,搜索可能会起作用,但它仍然有些限制,应该有一种更简单的方法,而不是整天解码和编码。
我尝试将io.TextIOWrapper 包裹在io.BufferedRandom 中,但无济于事:
AttributeError: 'mmap.mmap' object has no attribute 'seekable'
创建包装器(使用继承)并将方法 seekable、readable 和 writable 设置为返回 True 也不起作用。
关于编码,可能会采用固定长度编码,如utf-32、代码点或utf-16 的较低 BMP(如果甚至可能仅指该部分)。
欢迎任何 python 版本的解决方案。
【问题讨论】:
-
对于像 UTF-8 这样的可变长度编码,如果不通过之前的 49999 个字符,就无法判断字符 50000 在哪里,这违背了内存映射的目的。你可能会发现一些适用于固定长度编码的东西。
-
@user2357112 认为这可能会造成问题,但为了这个问题,可能会假设固定长度,如
utf-16、utf-32或代码点。 -
UTF-16 仍然是可变长度的,无论如何,问题在于文件的编码,而不是模式的编码。
-
@user2357112 更新为指定
utf-32或utf-16的较低BMP,如果它甚至可能仅指该部分。是的,文件的编码确实是问题。
标签: python python-2.7 python-3.x encoding memory-mapped-files