¿Por qué el mmap de Python no funciona con archivos grandes?

[Editar: este problema solo se aplica a sistemas de 32 bits. Si su computadora, su sistema operativo y su implementación de Python son de 64 bits, entonces los archivos de tamaño enorme funcionan de manera confiable y son extremadamente eficientes.]

Estoy escribiendo un módulo que, entre otras cosas, permite el acceso de lectura en modo bit a los archivos. Los archivos pueden ser potencialmente grandes (cientos de GB), así que escribí una clase simple que me permite tratar el archivo como una cadena y oculta toda la búsqueda y la lectura.

En el momento en que escribí mi clase de envoltorio no sabía sobre elmódulo mmap. Al leer la documentación para mmap pensé"genial: esto es justo lo que necesitaba, sacaré mi código y lo reemplazaré con un mmap. Probablemente sea mucho más eficiente y siempre es bueno eliminar el código".

¡El problema es que mmap no funciona para archivos grandes! Esto es muy sorprendente para mí, ya que pensé que era quizás la aplicación más obvia. Si el archivo está por encima de unos pocos gigabytes entonces obtengo unEnvironmentError: [Errno 12] Cannot allocate memory. Esto solo ocurre con una compilación Python de 32 bits, por lo que parece que se está quedando sin espacio de direcciones, pero no puedo encontrar ninguna documentación sobre esto.

Mi código es justo

f = open('somelargefile', 'rb')
map = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)

Así que mi pregunta es¿Me estoy perdiendo algo obvio aquí? ¿Hay alguna manera de hacer que mmap funcione de manera portátil en archivos grandes o debo volver a mi ingenuo contenedor de archivos?

Actualización: Parece que hay una sensación de que el mmap de Python debería tener las mismas restricciones que el mmap de POSIX. Para expresar mejor mi frustración aquí hay una clase simple que tiene una pequeña parte de la funcionalidad de 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)

Es de solo lectura y no hace nada sofisticado, pero puedo hacer lo mismo que con un mmap:

map2 = Mmap(f)
print map2[0:10]
print map2[10000000000:10000000010]

excepto que no hay restricciones en el tamaño del archivo. No es demasiado difícil realmente ...

Respuestas a la pregunta(8)

Su respuesta a la pregunta