Python将2GB的文本文件加载到内存中

Python将2GB的文本文件加载到内存中,python,memory,text-files,Python,Memory,Text Files,在Python2.7中,当我将2.5GB文本文件中的所有数据加载到内存中以加快处理速度时,如下所示: >>> f = open('dump.xml','r') >>> dump = f.read() 我得到了以下错误: Python(62813) malloc: *** mmap(size=140521659486208) failed (error code=12) *** error: can't allocate region *** set a br

在Python2.7中,当我将2.5GB文本文件中的所有数据加载到内存中以加快处理速度时,如下所示:

>>> f = open('dump.xml','r')
>>> dump = f.read()
我得到了以下错误:

Python(62813) malloc: *** mmap(size=140521659486208) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError
Python(62813)malloc:**mmap(大小=140521659486208)失败(错误代码=12)
***错误:无法分配区域
***在malloc\u error\u break中设置断点以进行调试
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
记忆者
为什么Python尝试为
2563749237
字节数据分配
140521659486208
字节内存?如何修复代码以使其加载所有字节


我有大约3GB的内存可用。该文件是一个wiktionaryxml转储文件。

基于一些快速的谷歌搜索,我发现它似乎解决了您似乎遇到的问题。假设您运行的是基于错误代码的Mac或Linux,您可以尝试使用论坛帖子中建议的
gc.enable()
gc.collect()
实现垃圾收集。

如果使用,您将能够立即将整个文件加载到内存中

import mmap

with open('dump.xml', 'rb') as f:
  # Size 0 will read the ENTIRE file into memory!
  m = mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ) #File is open read-only

  # Proceed with your code here -- note the file is already in memory
  # so "readine" here will be as fast as could be
  data = m.readline()
  while data:
    # Do stuff
    data = m.readline()

为什么不先将源代码加载到内存中,然后线性地解析XML呢?我试过了,花了很长时间。由于我有很多内存,我想把所有的东西都加载到内存中,以加快速度。我的Mac Pro上有8GB的内存,我想它是64bitWow。128兆字节?这是
malloc()
的雄心壮志。我建议使用xml元素树而不是使用SAX。除了您之外,没有人会喜欢您的正则表达式解决方案。我的代码只有2行,用于将数据加载到内存中,没有其他用于垃圾收集的活动对象。我获得了
mmap.error:[Errno 13]权限被拒绝
m=mmap.mmap(…)
,如何修复它?@pckben这是因为文件是以只读模式打开的,mmap将尝试映射读写:在您的
mmap.mmap
调用中添加
prot=mmap.prot_read
,您会没事的。如果您真的必须完整地读取文件的内容,这个答案很好。在这种情况下,我不认为这是解决pckben情况的最佳解决方案。mmap是文件的内存映射。在分配的位置访问内存将访问该文件。操作系统是预先缓冲整个文件还是仅在访问时缓冲,这是配置的一部分;-)@pckben使用
open('myfile','rb')
以只读模式打开文件,但是
mmap
将尝试以读写方式映射文件,这会导致错误。