相关疑难解决方法(0)

为什么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万
查看次数

如何在文件的行和列位置插入文本?

我想在文件中特定行的特定列插入一个字符串.

假设我有一个文件 file.txt

How was the English test?
How was the Math test?
How was the Chemistry test?
How was the test?
Run Code Online (Sandbox Code Playgroud)

我想How was the History test?通过History在第4行第13列添加字符串来更改最后一行.

目前我读取文件的每一行并将字符串添加到指定的位置.

with open("file.txt", "r+") as f:
    # Read entire file
    lines = f.readlines()

    # Update line
    lino = 4 - 1
    colno = 13 -1
    lines[lino] = lines[lino][:colno] + "History " + lines[lino][colno:]

    # Rewrite file
    f.seek(0)
    for line in lines:
        f.write(line)
    f.truncate()
    f.close()
Run Code Online (Sandbox Code Playgroud)

但我觉得我应该能够简单地将行添加到文件中,而无需读取和重写整个文件.

python python-3.x

12
推荐指数
1
解决办法
2670
查看次数

在Python中从文件中删除一行

我正在尝试删除包含特定字符串的特定行.

我有一个名为numbers.txt的文件,其中包含以下内容:

peter
tom
tom1
yan

我要删除的是文件中的tom,所以我做了这个函数:

def deleteLine():
fn = 'numbers.txt'
f = open(fn)
output = []
for line in f:
    if not "tom" in line:
        output.append(line)
f.close()
f = open(fn, 'w')
f.writelines(output)
f.close()
Run Code Online (Sandbox Code Playgroud)

输出是:

彼得
严

正如你所看到的,问题是函数删除tom和tom1,但我不想删除tom1.我想删除汤姆.这是我想要的输出:

peter
tom1
yan

有任何改变功能的想法是为了正确吗?

python string file line

10
推荐指数
1
解决办法
4万
查看次数

删除巨大的csv中已知的确切行

我有一个~2亿行,7列csv文件.我需要删除行2636759.这个文件是7.7GB,超过内存容量.我对R最熟悉,但也可以在python或bash中做到这一点.

我无法在一次操作中读取或写入此文件.在磁盘上以增量方式构建此文件的最佳方法是什么,而不是尝试在内存中执行此操作?

我试图在SO上找到它,但只能找到如何使用足够小的文件来读取/写入内存,或者使用位于文件开头的行.

python csv r

6
推荐指数
1
解决办法
554
查看次数

如何有效删除大文件中间的一行?

可能重复:
从Python中的大文件中删除行的最快方法
如何在不覆盖所有内容的情况下编辑txt文件中间的行?

我知道我可以将每行读入列表,删除一行,然后将列表写回.

但是文件很大,有没有办法删除文件中间的一个部分,而不需要重写整个文件?

python file python-2.7

0
推荐指数
1
解决办法
1744
查看次数

标签 统计

python ×5

file ×2

csv ×1

line ×1

memory ×1

mmap ×1

performance ×1

python-2.7 ×1

python-3.x ×1

r ×1

string ×1