ARMv8.0下duckdb的安装与编译过程-解决 Failed to allocate block of 2048 bytes


背景

duckdb 是一个很流行的单机版数据库引擎
同事下载了相关的预编译的二进制, 发现duckdb会报错如下:
"Out of Memory Error: Failed to allocate block of 2048 bytes"
详细的错误信息为:
./duckdb
v0.9.0 0d84ccf478
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
D select 1 ;
Error: unable to open database ":memory:": Out of Memory Error: Failed to allocate block of 2048 bytes

简单的验证

github 上面很多类似的错误提示信息的issue
大部分都指向了 ARMv8的 64KB的页大小问题 需要注明
x86大部分的页大小是 4KB
但是aarch64的页面大小却是 64KB
验证方法
getconf PAGESIZE
65536 大部分报错都提示与页大小强相关.
解决方法也比较简单:
编译时增加参数为:
-DBUILD_JEMALLOC_EXTENSION=0
就可以解决这个问题.

一波三折

看到问题issue其实还是很高兴的
直接进行了相关的操作 git clone https://github.com/duckdb/duckdb
cd duckdb
cmake -DBUILD_JEMALLOC_EXTENSION=0
time make 等待了30分钟后(ARM编译比较慢)
duckdb 9.2 的编译结果依旧是报错 看到issue里面说需要切换到最新分支, 直接懵逼了
这个已经是 2023.10.20 时最新的分支了 . 依旧报错.
自己在9.1 9.2 的两个版本进行了多次编译, 耗费了接近一天的时间(这个是支线工作)
依旧不行

问题解决

为了解决上面的问题
自己按照issue里面提的 直接下载了 v0.5.0 的的预编译包,发现是可以的
但是同事反馈, 这个预编译包很多特定有丢失. 这两个场景很容易猜测到是不是 9.0的版本出现了比较坑的Bug
为了验证. 晚上开始进行一下版本降级的编译与测试 步骤为
cd duckdb
mkdir build8.0 build8.1 build9.0 [root@BM119 duckdb]# cd duckdb/
[root@BM119 duckdb]# ll
总用量 220
drwxr-xr-x 13 root root 311 10月 21 00:00 benchmark
drwxr-xr-x 9 root root 305 10月 19 15:12 build
drwxr-xr-x 9 root root 305 10月 20 22:35 build8.0
drwxr-xr-x 9 root root 305 10月 20 23:14 build8.1
drwxr-xr-x 9 root root 305 10月 21 00:26 build9.0 然后进入到不同的版本build 里面执行相关命令
比如 build8.0
执行命令为:
cd duckdb
git checkout v0.8.0
cd build8.0
cmake -DBUILD_JEMALLOC_EXTENSION=0 ..
time make 需要注意
第一步的 git checkout v0.8.0 将duckdb的版本进行进行一下切换. 到具体的版本号上面
cmake 在build8.0的子目录下面,通过 .. 获取上一级目录的资源信息.
然后再build8.0 的目录下面执行make, 就会产生特定版本的duckdb的二进制 checktout 的提示为:
之前的 HEAD 位置是 0d84ccf478 Merge pull request #9101 from carlopi/i686
HEAD 目前位于 e8e4cea5ec Merge pull request #7550 from hannes/httpfsstaticopensslforsure 然后cmake时会展示版本信息
[root@BM119 build]# cmake ..
-- git hash e8e4cea5ec, version v0.8.0
CMake Warning at CMakeLists.txt:443 (message):
Please use a recent compiler for debug builds

结论

duckdb的 v0.9.0 以及之后的版本aarch64编译后会报错
v0.8.1的版本增加了 -DBUILD_JEMALLOC_EXTENSION=0 后还是可以正常运行的
应该是官方的bug. 可能duckdb v0.9.0 忘记考虑这个场景了.
其实可以提一个issue 让duckdb官方处理 !-_-!
验证效果 [root@BM119 build8.1]# ./duckdb
v0.8.1 6536a77232
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
D select 1;
┌───────┐
│ 1 │
│ int32 │
├───────┤
│ 1 │
└───────┘
D 问题解决.

ARMv8.0下duckdb的安装与编译过程-解决 Failed to allocate block of 2048 bytes的更多相关文章

  1. CentOS 7.0下使用yum安装MySQL

    CentOS7默认数据库是mariadb,配置等用着不习惯,因此决定改成mysql,但是CentOS7的yum源中默认好像是没有mysql的.为了解决这个问题,我们要先下载mysql的repo源. 1 ...

  2. MSW下wxWidgets的安装与编译

    教程摘自网上各大博客.贴吧.论坛,结合自己的实践做了一些实质性的修改. 一.安装 首先从http://sourceforge.net/projects/wxwindows/files/2.8.12/w ...

  3. centos7.2下caffe的安装及编译

    1.前期准备 安装依赖 sudo yum install protobuf-devel leveldb-devel snappy-devel opencv-devel boost-devel hdf5 ...

  4. Red Hat5下源码安装mysql5.6过程记录

    1.安装cmake包 [root@edu soft]# tar -xzf cmake-.tar.Z [root@edu soft]# cd cmake- [root@edu cmake-]# ./co ...

  5. caffe搭建--caffe在invidia+cpu 酷睿2Q9300 + ubuntu16.04.2上面的安装和编译过程

    本文原创,转载请注明出处. ------------------------------------------------分割线-------------------------------- 概要 ...

  6. Linux下源码安装redis,编译安装

    1.下载redis源码 [root@localhost opt]# wget http://download.redis.io/releases/redis-4.0.10.tar.gz 2.解压缩 [ ...

  7. Yii2.0 下使用 composer 安装七牛

    最近在捣鼓一个网站,要上传图片,于是选择了七牛.由于Yii2.0框架本身并不具有七牛用来上传图片的接口,只能自己动手给Yii2.0框架安装七牛了. 首先在根目录下的 composer.json 进行配 ...

  8. linux下boost的安装与编译

    1.从boost官网下载boost库包: 2.然后解压到linux下的任意一个文件夹, 3.进入boost_1_57文件夹下,不同的boost版本会解压城不同的库文件夹, 4.执行././bootst ...

  9. Centos7.0下MySQL的安装

    1.下载mysql的repo源 $ wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 2.安装mysql-comm ...

  10. linux 中gcc的·安装、编译过程

    一.安装gcc编译器 通过命令gcc -v查看当前的GCC版本 [root@localhost /]# gcc -v Reading specs from /usr/i386-glibc-2.1-li ...

随机推荐

  1. Pikachu漏洞靶场 PHP反序列化

    PHP反序列化 查看源码,以下为关键代码: class S{ var $test = "pikachu"; function __construct(){ echo $this-& ...

  2. cookie和session的一些疑惑以及ai解答

    我: 那么当浏览器关闭的时候,当再次访问这个地址的时候,为什么之前设置的cookie没有被删除掉?而且按照你说的这次可能会生成一个新的sessionID,那么cookie里面的其他数据,它是如何获取上 ...

  3. NebulaGraph实战:2-NebulaGraph手工和Python操作

      图数据库是专门存储庞大的图形网络并从中检索信息的数据库.它可以将图中的数据高效存储为点(Vertex)和边(Edge),还可以将属性(Property)附加到点和边上.本文以示例数据集basket ...

  4. 华为云弹性云服务器ECS搭建FTP服务实践

    摘要:在使用华为弹性云服务器ECS搭建FTP服务的时候,经常会遇到搭建完成后无法访问的问题.本篇通过演示windows IIS搭建FTP方法,讲解ftp主动模式.被动模式原理来说明无法访问的原因及解决 ...

  5. 数仓集群管理:单节点故障RTO机制分析

    摘要:大规模分布式系统中的故障无法避免.发生单点故障时,集群状态和业务是如何恢复的? 本文分享自华为云社区<GaussDB (DWS) 集群管理系列:单节点故障RTO机制分析(集群状态恢复篇)& ...

  6. 华为云GaussDB新产品特性亮相DTC2021,重磅新品开源预告

    摘要:华为云数据库产品部CTO庄乾锋携3位GaussDB技术专家在DTC2021大会上分享了产品最新技术.优秀实践案例,以及透露了重大新品即将开源,以数据驱动业务发展,为企业数字化转型持续注入新动力. ...

  7. 图解带你掌握`JVM`运行时核心内存区

    摘要:堆空间差不多是最大的内存空间,也是运行时数据区最重要的内存空间.堆可以处于物理上不连续的内存空间,但在逻辑上它应该被视为连续的. 本文分享自华为云社区<醒酒菜:动画图解核心内存区--堆&g ...

  8. JS 实现 HashMap

    HashMap代码(这种实现方式是错误的,错误原因:代码中_map._length变量是HashMap的所有实例共用的): /** * HashMap * 2021年09月09日 */ (functi ...

  9. 【Protoc】VS2019 (VS平台) 使用 CMake 编译安装、使用 Protobuf 库

    背景:工作中需要使用到 protobuf,看了一些教程,感觉都不是很适合,便自己总结一些 开发环境: Win 10 VS2019 CMake 3.24.2 Protobuf 3.21.12 (Prot ...

  10. The 18th Zhejiang Provincial Collegiate Programming Contest 补题记录(ACFGJLM)

    补题链接:Here A. League of Legends 签到题,求和判断即可 ll suma, sumb; void solve() { ll x; for (int i = 1; i < ...