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 中失败 的相关文章

  • 表达式中的 Python 'in' 关键字与 for 循环中的比较 [重复]

    这个问题在这里已经有答案了 我明白什么是in运算符在此代码中执行的操作 some list 1 2 3 4 5 print 2 in some list 我也明白i将采用此代码中列表的每个值 for i in 1 2 3 4 5 print
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • Numpy 优化

    我有一个根据条件分配值的函数 我的数据集大小通常在 30 50k 范围内 我不确定这是否是使用 numpy 的正确方法 但是当数字超过 5k 时 它会变得非常慢 有没有更好的方法让它更快 import numpy as np N 5000
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 为美国东部以外地区的 Cloudwatch 警报发送短信?

    AWS 似乎没有为美国东部以外的 SNS 主题订阅者提供 SMS 作为协议 我想连接我的 CloudWatch 警报并在发生故障时接收短信 但无法将其发送到 SMS YES 经过一番挖掘后 我能够让它发挥作用 它比仅仅选择一个主题或输入闹钟
  • 在Python中重置生成器对象

    我有一个由多个yield 返回的生成器对象 准备调用该生成器是相当耗时的操作 这就是为什么我想多次重复使用生成器 y FunctionWithYield for x in y print x here must be something t
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • 如何使用 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 的任意倍数