注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭研后台技术中心的博客

 
 
 
 
 

日志

 
 

python中使用direct io的方法  

来自osdba   2012-09-29 10:05:11|  分类: 开发技巧 |举报 |字号 订阅

  下载LOFTER 我的照片书  |

当使用direct io时,需要内存是按页大小(4k)对齐的,在python 本身的内存分配是自动的,无法做到按4k对齐。而python提供了ctypes包,通过这个包可以直接调用动态库,本文的方法就是使用这个包来分配对齐内存,同时通过这个包来使用direct IO。

具体见下面的代码:

#/usr/bin/evn python
# _*_ coding:UTF-8

import sys
import time
import os

import ctypes
import ctypes.util

def ctypes_alloc_aligned(size, alignment):
    buf_size = size + (alignment - 1)
    #先使用bytearray函数分配一块内存

raw_memory = bytearray(buf_size)

#然后从raw_memory创建一个ctypes对象
    ctypes_raw_type = (ctypes.c_char * buf_size)
    ctypes_raw_memory = ctypes_raw_type.from_buffer(raw_memory)
  #通过ctypes对象的addressof获得内存指针的值
    raw_address = ctypes.addressof(ctypes_raw_memory)
    offset = raw_address % alignment

  #通过内存地址可以得出,对齐内存的偏移量
    offset_to_aligned = (alignment - offset) % alignment
    ctypes_aligned_type = (ctypes.c_char * (buf_size - offset_to_aligned))

#通过内存的偏移量,创建对齐内存的ctype对象
    ctypes_aligned_memory = ctypes_aligned_type.from_buffer(raw_memory, offset_to_aligned)
    return ctypes_aligned_memory

libc = ctypes.CDLL(ctypes.util.find_library('c'))

#获得一块4k对齐的内存

buf =ctypes_alloc_aligned(1024*1024, 4096)

#direct io的方式打开块设备文件
fd = os.open('/dev/loop0', os.O_RDWR|os.O_DIRECT)
err_code = libc.read(ctypes.c_int(fd), buf, ctypes.c_int(1024*1024))
#把directIO读出的数据放到python的一个字符串变量中:
data = buf.raw[0:errCode]
#写数据
libc.memset(buf, ctypes.c_int(0), ctypes.c_int(1024*1024))
libc.write(ctypes.c_int(fd), buf, ctypes.c_int(1024*1024))
os.close(fd)


上面的代码中,ctypes_alloc_aligned是获得一段对齐内存的函数。
  评论这张
 
阅读(1710)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017