mmap的简单使用

参考网址:
http://www.cnblogs.com/zhoujinyi/p/6062907.html
http://www.cnblogs.com/huxiao-tee/p/4660352.html

内存映射模块的使用
mmap是一种虚拟内存映射的方法,好比:内存放目录,磁盘放数据,实现相对的快速读取

下面对这段代码进行详细的说明:
m=mmap.mmap(fileno, length[, flags[, prot[, access[, offset]]]])

 #  fileNo:文件描述符,可以使file对象的fileno()方法,或者来自os.open()
    #  os.O_RDONLY:read only;
    # os.O_WRONLY:write only
    # os.O_RDWR:read and write
    # os.O_APPEND:append to the file
    # os.O_CREAT:create and open a new file
    # os.O_EXCL: if the file is existing,return false
    # os.O_TRUNC:open file and then empty data
    # os.O_BINARY:open a file with a binary mode and have no convert
    # os.O_NOINHERIT: no in share
    # os.O_SHORT_LIVED:
    # os.O_TEMPORARY: new a temp file with O_CREAT function
    # os.O_RANDOM:cache Optimization and no limit with rand reads
    # os.O_SEQUENTIAL:cache optimization and no limit with sequense reads
    # os.O_TEXT:read a file as a text(if not,it will be convert to text ,maybe take some mistakes)

  # length :要映射文件部分的大小(单位是字节),这个值为0,则映射整个文件,如果大小大于文件当前大小,则扩展这个文件

# flags:MAP_PRIVATE:这段内存映射只有本进程可以使用,mmap.MAP_SHARED:将聂村映射和其他进程共享,所有映射了同一个文件的进程,都能够看到其中一个所做的更改

# prot:mmap.PROT_READ,mmap.PROT_WRITE和 mmap.PROT_WRIE|mmap.PROT_READ。最后的含义是同时可写可读。

# access:在mmap中有可选参数access的值有: ACCESS_ERAD:读访问,ACCESS_WRITE:写访问,默认; ACCESS_COPY:拷贝访问,不会把更改写到文件,
# 使用flush把更改写到文件

包含的方法:

# m.close()
# m.find(str,start=0):从左到右寻找子串最早出现的位置
# m.flush()
# m.move():等于 m[dstoff:dstoff+n] = m[srcoff:srcoff+n],把从 srcoff 开始的 n 个字节复制到从 dstoff 开始的n个字节,可能会覆盖重叠的部分。
# m.read(n): 和file.read(n) 方法类似:返回一个字符串,从 m 对应的文件中最多读取 n 个字节,将会把 m 对应文件的位置指针向后移动
# m.read_byte():返回一个字节场的字符串,从m对应的文件中读取一个字节,要是已经到了eof位置继续调用,则会抛出异常valueError
# m.readline():返回一个字符串,从 m 对应文件的当前位置到下一个'\n',当调用 readline() 时文件位于 EOF,则返回空字符串;
# m.resize:传说中有问题,待定
# m.seek()
# m.size():这里不是m对象的长度(len(m))
# m.tell() 返回m对应文件的当前位置;
# m.write()把 str 写到 m 对应文件的当前位置,如果从 m 对应文件的当前位置到 m 结尾剩余的空间不足len(str),则抛出 ValueError;
# m.write_byte(byte):把1个字节(对应一个字符)写到 m 对应文件的当前位置,实际上 m.write_byte(ch) 等于 m.write(ch)。如果 m 对应文件的当前位置在 m 的结尾,
    # 也就是 m 对应文件的当前位置到 m 结尾剩余的空间不足1个字节,write() 抛出异常ValueError,而 write_byte() 什么都不做。

实际代码:

import mmap,os
# 注意:这里的os.open 和我们平时使用的open方法是不太一样的,os.open更加接近底层一些。
# length取值为0(或者小于文件长度),这个时候映射整个文件
# 如果length大于文件大小,这个时候就是扩展文件,m.close之后会自动添加length-size(file)个null
#这里还有一个问题:就是os.O_APPEND的时候会说windows没权限,怎么设置都没解决问题,暂时没找到解决方案。先放着。。。。
m = mmap.mmap(os.open('E:/credit.csv',os.O_RDWR),length=0)

print(m.read(20))

print(m.tell())

m.seek(0)

# python 2.x 可以直接使用字符串,但是3.x的不行,传入的参数需要是bytes流
m.find(bytes('SET',encoding='utf-8'),0)

# In[]:
# 返回的是数据的字节值,因为python3.x后 str和bytes是严格不同的存储形式,这里的read_byte(),读取的是一个字节对应的unicode
re = m.read_byte()
print(re)

# In[]:
m.seek(0)
print(m.readline())

# In[]:
# 这里需要注意:是m对象的长度,如果length为0,那么size就是文件大小,如果length>文件大小,那么,size就是length的大小
m.size()

# m.move(dstoff,scroff,n) <=>  m[dstoff:dstoff+n] = m[srcoff:srcoff+n]

m[1:100]  # 切片1:100的值

m.move(1,50,8) # 从50开始到后面8个字节的数据替换从1开始的后面8个字节的数据

# In[]:
# 注意:如果在length设置为0的时候,这里写入数据会报data out of range
# m.seek(m.size()-1)
m.seek(794)
m.write(bytes('我的测试数据',encoding='utf-8'))

m.close()

猜你喜欢

转载自blog.csdn.net/qwertyuiop5rghar/article/details/84348754