Python C 模块 - Malloc 在特定版本的 Python 中失败

2024-03-12

我正在编写一个 Python 模块来在 O_DIRECT 上下文上执行 IO。 O_DIRECT 的限制之一是,对于 2.4 和 2.5 内核,您必须读入在 4096 字节边界上对齐的缓冲区,而 2.6 及更高版本将接受 512 的任意倍数。

明显的内存分配候选是posix_memalign(void **memptr, size_t alignment, size_t size)

在我的代码中,我分配了一个区域,如下所示:

char *buffer = NULL;

int mem_ret = posix_memalign((void**)&buffer, alignment, size);

if (!buffer) {
    PyErr_NoMemory();
    return NULL;
}

/* I do some stuff here */

free(buffer);

当我使用 python3.2 编译并导入模块时,这个(以及未显示的模块的其余部分)工作正常。

当我尝试使用 python2.7 进行相同操作时(我想保留兼容性),它会抛出 PyErr_NoMemory 异常,并且mem_ret == ENOMEM,表明无法分配。

为什么我编译的 Python 版本会影响 posix_memalign 的运行方式?

操作系统:Ubuntu 12.04 LTS

编译器:Clang + GCC 显示相同的行为

UPDATE

感谢 user694733,我现在有了一段可以工作的代码
然而,它的工作原理让我更加困惑:

#if PY_MAJOR_VERSION >= 3
char *buffer = NULL;

int mem_ret = posix_memalign((void**)&buffer, alignment, count);
#else
void *mem = NULL;

int mem_ret = posix_memalign(&mem, alignment, count);

char *buffer = (char*)mem;
#endif

谁能解释一下为什么不正确第一个块在 Python3 下工作,但在 2.7 下不工作,更重要的是为什么correct第二个块在Python3下不起作用?

UPDATE 2

在确定了下面代码的正确形式后,情节变得更加复杂,我在 4 个不同版本的 Python 上进行了测试。

void *mem = NULL;

int mem_ret = posix_memalign(&mem, alignment, count);

char *buffer = (char*)mem;

if (!buffer) {
    PyErr_NoMemory();
    return NULL;
}

/* Do stuff with buffer */

free(buffer);

Under Python 2.7:此代码按预期运行。
Under Python 3.1:此代码按预期运行。
Under Python 3.2:此代码生成mem_ret == ENOMEM并返回 NULLbuffer
Under Python 3.3:此代码按预期运行。

Ubuntu 存储库中未包含的 Python 版本是从 PPA 安装的,地址为https://launchpad.net/~fkrull/+archive/deadsnakes https://launchpad.net/~fkrull/+archive/deadsnakes

如果标记为 Python 二进制文件的版本可信,那么我安装的版本是:

python2.7 
python3.1
python3.2mu (--with-pymalloc --with-wide-unicode)
python3.3m (--with-pymalloc)

默认 Python3 发行版中使用 Wide-unicode 标志是否会导致此错误?如果是这样,这是怎么发生的?

为了清楚起见,ENOMEM任何变体都会发生分配失败malloc(),甚至像这样简单的事情malloc(512).


要快速解决问题,请坚持mmap代替malloc+memalign

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python C 模块 - Malloc 在特定版本的 Python 中失败 的相关文章

随机推荐

  • 如何使用 Exchange Web 服务获取真实电子邮件地址?

    我正在尝试使用 Exchange Web 服务获取电子邮件发件人的真实电子邮件地址 但是mailitem Sender Address包含类似的东西 O EXCHANGELABS OU EXCHANGE ADMINISTRATIVE GRO
  • React js读取doc/docx文件的文本

    我需要读取用户上传的 doc docx 文件的内容 我尝试过使用jszip with docxtemplater 但我无法读取该文件 如果除了 docs docx 文件之外 它还可以读取 txt 文件 那就太好了 我有一个这样的 docx
  • jQuery SVG 与 Raphael [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在使用 SVG 和 JavaScript jQuery 开发一个交互式界面 我试图在两者之间做出决定Raphael http raphael
  • Angular6 Jasmine TypeError:expect(...).toBeVisible 不是一个函数

    在 Angular6 中设置 jasmine query matches 在 Angular 5 项目上 它看起来很简单 import from jasmine jquery lib jasmine jquery import from j
  • 如何以特定角度旋转图像的坐标(x,y)

    为了更好地理解 请在 Jupyter Notebook 中重现代码 我有两个文件 img jpg 和 img txt Img jpg 是图像 img txt 是面部地标 如果将它们都绘制出来 它将如下所示 我将图像旋转了 24 5 度 但是
  • 在React中导入第3方jQuery,CSS,Java脚本到index.html比使用npm或yarn更好

    在react中导入好不好外部 javascript jQuery css 到 index html文件在公共文件夹中 以及是否对应用程序性能有任何影响 我在 React 应用程序中使用了一些 jQuery 函数 示例 日期选择器 它也工作得
  • android - 扩展库有很多问题

    我需要使用新的 google play 或市场 扩展库 但我很难使用它 我想知道是否有其他人在使用它并注意到我所看到的相同问题 所以如果您能帮助解决这些问题 我将非常高兴 1 有时我没有将重要事件 例如错误 返回到下载程序活动 2 它在某些
  • Android应用程序:如何使用相机并抓取图像字节?

    我正在尝试为 Android 创建一个小型应用程序 它使用设备的相机拍摄照片 并在其顶部放置一个 PNG 框架 这样 最终保存的图片上面就会有一个海滩 或者帽子 或者任何东西 有人有具有这种行为的示例程序吗 查看有关使用图像捕获意图的 SD
  • 条形图,几何底部和 x 轴之间没有空间,上方保持空间

    当我在 ggplot2 中绘制条形图时 我想将条形底部和 x 轴之间的空间减少到 0 但保留条形和绘图框上方的空间 我有一个技巧可以在下面做到这一点 它很脏 我想再次干净 有没有办法在没有肮脏的小黑客的情况下实现这种行为 默认 需要上方空间
  • ASP.NET MVC 中 <%: 和 <%= 有什么区别?

    我在任何地方都找不到这个信息 可能是因为谷歌忽略了关键词 使用之间有区别吗 is ASP NET MVC 2 中的新事物 http weblogs asp net scottgu archive 2010 04 06 new lt gt s
  • 如何从 python 脚本调用 python 脚本

    我有一个 python 脚本 b py 它每 5 秒打印一次时间 while 1 print Start s time ctime time sleep 5 print End s time ctime time sleep 5 在我的 a
  • 推导式符号表中的这些额外符号是什么?

    我在用着symtable https docs python org 3 6 library symtable html获取一段代码的符号表 奇怪的是 当使用推导式 listcomp setcomp 等 时 有一些我没有定义的额外符号 重现
  • 使用 cmake 复制纯 .o 文件

    我试图让 cmake 在 Linux 上 创建一些静态对象 o 文件并将它们安装到外部目录 为此我有一个清单 object sources 包含源的项目路径 并将其放在顶层CMakeLists txt set local objects f
  • 复制 varbinary(max) 字段时超出最大行大小

    我需要将数据 varbinary max 从一个表迁移到另一个表 当执行更新来执行此操作时 我收到以下错误 Msg 511 Level 16 State 1 Line 18 Cannot create a row of size 8078
  • 从 asset 文件夹加载的图像与 res/drawable 的大小不同

    在我的项目中 我将图像从drawable hdpi文件夹动态加载到ImageSwitcher像这样 int images new int 2 logoImage ImageSwitcher findViewById R id logo im
  • 在Heroku管道中批量设置环境变量

    我正在尝试批量设置 Heroku 管道的环境变量 因为 Heroku 在新版本中不再使用管道中父级的环境变量 https devcenter heroku com articles review apps new configuration
  • 在 Swift 中创建一个不规则的 UIButton,其中透明部分不可点击

    我正在制作一个饼图 其中每个部分都是一个带有背景图像的单独按钮 但 UIButton 具有矩形形状并且所有按钮都重叠 有没有办法让 UIButton 成为不规则图像的精确形状 在 Swift 中 这样就不会发生这种情况 任何帮助 将不胜感激
  • 如何获取特定cookie的域?

    有一个网站www example com所有 cookie 均设置为www子域 现在有一个新的子域 我希望所有子域都能看到 cookie 目标是重写www example com给所有老访客的饼干 example com或者写新的 exam
  • 如何使用 Rails 创建包含公式的电子表格?

    我需要一些 gem 插件来创建一个 Excel 电子表格 其中包含要在我的 Rails 应用程序中使用的公式 有什么建议么 我使用过 Roo 它非常好且易于进行电子表格处理 一旦安装了所有 gem 依赖项 但是 它本身不支持公式 它不会评估
  • Python C 模块 - Malloc 在特定版本的 Python 中失败

    我正在编写一个 Python 模块来在 O DIRECT 上下文上执行 IO O DIRECT 的限制之一是 对于 2 4 和 2 5 内核 您必须读入在 4096 字节边界上对齐的缓冲区 而 2 6 及更高版本将接受 512 的任意倍数