小编Yaa*_*lch的帖子

为什么Python的mmap不适用于大文件?

[编辑:此问题仅适用于32位系统.如果你的计算机,你的操作系统和你的python实现是64位的,那么mmap-ing巨大的文件可以正常工作并且非常高效.

我正在编写一个模块,其中包括允许按位读取文件访问.这些文件可能很大(数百GB),所以我编写了一个简单的类,让我像处理字符串一样处理文件并隐藏所有的搜索和阅读.

当我写我的包装类时,我不知道mmap模块.在阅读mmap的文档时,我认为"很棒 - 这正是我所需要的,我将取出我的代码并用mmap替换它.它可能效率更高,删除代码总是好的."

问题是mmap不适用于大文件!这对我来说非常令人惊讶,因为我认为它可能是最明显的应用程序.如果文件超过几千兆字节,那么我得到一个EnvironmentError: [Errno 12] Cannot allocate memory.这只发生在32位Python构建中,所以它似乎耗尽了地址空间,但我找不到任何关于此的文档.

我的代码就是

f = open('somelargefile', 'rb')
map = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
Run Code Online (Sandbox Code Playgroud)

所以我的问题是我错过了一些明显的东西吗?有没有办法让mmap可以在大文件上移植,或者我应该回到我天真的文件包装器?


更新:似乎有一种感觉,Python mmap应该具有与POSIX mmap相同的限制.为了更好地表达我的挫败感,这是一个简单的类,它具有mmap的一小部分功能.

import os

class Mmap(object):
    def __init__(self, f):
        """Initialise with a file object."""
        self.source = f

    def __getitem__(self, key):
        try:
            # A slice
            self.source.seek(key.start, os.SEEK_SET)
            return self.source.read(key.stop - key.start)
        except AttributeError:
            # single element
            self.source.seek(key, os.SEEK_SET)
            return self.source.read(1)
Run Code Online (Sandbox Code Playgroud)

它是只读的,并没有做任何花哨的事情,但我可以像使用mmap一样:

map2 = Mmap(f)
print map2[0:10]
print map2[10000000000:10000000010]
Run Code Online (Sandbox Code Playgroud)

除了文件大小没有限制.真的不太难......

python memory performance mmap

44
推荐指数
5
解决办法
3万
查看次数

良好的在线C++语法参考?

您是否知道精确而简洁的在线C++语法参考?请提供链接......

c++ syntax

10
推荐指数
3
解决办法
4479
查看次数

Meteor:deps.autorun中的collection.find().fetch()失败

我想在流星服务器上创建一个反应式集合查询,并在发生更改时处理结果.

这是我的代码:

if (Meteor.isServer) {
  Meteor.startup(function(){
    Deps.autorun(function(){
      var items=new Meteor.Collection('name').find().fetch();
      // ... process the items ...
    });
  });
}
Run Code Online (Sandbox Code Playgroud)

(实际上,对于此测试,整个项目仅包含一个.js文件中的上述代码).启动此程序时meteor会抛出错误:

/home/yaakov/Bug/.meteor/local/build/programs/server/boot.js:198
}).run();
   ^
Error: Can't call yield in a noYieldsAllowed block!
    at Function.Fiber.yield (packages/meteor/fiber_helpers.js:11)
    at Function.wait (home/yaakov/.meteor/tools/cef2bcd356/lib/node_modules/fibers/future.js:111:14)
    at Object.Future.wait (/home/yaakov/.meteor/tools/cef2bcd356/lib/node_modules/fibers/future.js:325:10)
    at new MongoConnection (packages/mongo-livedata/mongo_driver.js:196)
    at new MongoInternals.RemoteCollectionDriver (packages/mongo-livedata/remote_collection_driver.js:4)
    at Object.<anonymous> (packages/mongo-livedata/remote_collection_driver.js:44)
    at Object.defaultRemoteCollectionDriver (packages/underscore/underscore.js:750)
    at new Meteor.Collection (packages/mongo-livedata/collection.js:72)
    at app/Bug.js:4:17
    at packages/deps/deps.js:47
Run Code Online (Sandbox Code Playgroud)

我做错了什么?如何在流星服务器上创建响应式收集查询?

meteor

3
推荐指数
1
解决办法
522
查看次数

标签 统计

c++ ×1

memory ×1

meteor ×1

mmap ×1

performance ×1

python ×1

syntax ×1