DuckDB:一个可嵌入的分析型数据库

DuckDB 为什么这么快? 在我们的第二个管道中,我们对sale表进行了两次部分扫描,第一次扫描表的前半部分,第二次扫描表的后半部分。读取一行输入,第一个值保持不变,将输入的第二个和第三个值相加的结果 作为 输出中的第二个值 ,然后写出输出。最后,我谈到了 DuckDB 的并行模型:Morsel-Driven 并行支持跨任意数量核心的高效并行化,同时保持对多核处理的感知,从而有助于 DuckDB 的整体性能和效率。如果没有找到具有特定名称的表,我们会搜索具有该名称的其他实体,例如 Parquet 文件,直接对其执行查询。 阅读详情

DuckDB:一个可嵌入的分析型数据库

作者:Mark Raasveldt (m.raasveldt@cwi.nl) 和 Hannes Mühleisen (hannes@cwi.nl)
单位:CWI, 阿姆斯特丹

摘要:SQLite的巨大成功表明,人们需要一种不引人注目的进程内数据管理解决方案。然而,目前还没有针对分析型工作负载的此类系统。我们展示了DuckDB,这是一个新型的数据管理系统,旨在嵌入到其他进程中执行分析型SQL查询。在我们的演示中,我们将DuckDB与其他数据管理解决方案进行对比,以展示其在嵌入式分析场景中的性能。DuckDB作为开源软件,采用许可性许可证发布。

ACM参考格式:Mark Raasveldt 和 Hannes Mühleisen. 2019. DuckDB: an Embeddable Analytical Database. In 2019 International Conference on Management of Data (SIGMOD ’19), June 30-July 5, 2019, Amsterdam, Netherlands. ACM, New York, NY, USA, 4 pages. https://doi.org/10.1145/3299869.3320212


1. 引言

数据管理系统已经演变为大型单体数据库服务器,作为独立进程运行。这在一定程度上是为了满足同时为多个客户端提供服务的需求,部分是由于数据完整性要求。尽管功能强大,但独立系统需要相当大的努力才能正确设置,数据访问受到其客户端协议的限制。数据管理系统还有一个完全不同的用例,即嵌入到其他进程中的系统,数据库系统是一个链接库,完全在“宿主”进程中运行。这类系统中最著名的代表是SQLite,它是部署最广泛的SQL数据库引擎,拥有超过一万亿个活跃数据库。SQLite专注于事务性(OLTP)工作负载,包含一个基于B树存储格式的行优先执行引擎。因此,SQLite在分析型(OLAP)工作负载上的性能非常差。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图1:系统全景

嵌入式分析数据管理系统的需求显而易见,这一需求主要来自两个方面:交互式数据分析和“边缘”计算。交互式数据分析使用R或Python等工具进行。这些环境中通过扩展(如dplyr、Pandas等)提供的基本数据管理操作符与SQL查询中堆叠的关系操作符非常相似,但缺乏完整的查询优化和事务性存储。嵌入式分析数据管理系统也适用于边缘计算场景。例如,目前的智能电表会将数据转发到中央位置进行分析。这在带宽有限的无线电接口上存在问题,同时也引发了隐私问题。可嵌入的分析数据库非常适合支持这种用例,数据可以在边缘节点上进行分析。交互式分析和边缘计算这两个用例看似正交,但令人惊讶的是,不同的用例产生了相似的需求。例如,在这两种用例中,便携性和资源需求都是关键,对这两者都谨慎的系统将在两种使用场景中表现良好。

在我们之前的研究中,我们开发了MonetDBLite,这是一个从MonetDB系统派生的嵌入式分析系统。MonetDBLite成功地证明了嵌入式分析确实存在需求,它每月有数千次下载,并在全球范围内被使用,从荷兰中央银行到新西兰警察。然而,它的成功也暴露了在非专用系统中难以解决的几个问题。我们为嵌入式分析数据库确定了以下需求:

  • 对OLAP工作负载具有高效率,但不完全牺牲OLTP性能。例如,在仪表板场景中,多个线程使用OLTP查询更新数据,同时其他线程运行OLAP查询以驱动可视化,这是常见的用例。
  • 高度稳定性,如果嵌入式数据库崩溃(例如由于内存不足),它会将宿主进程一起拉下。这种情况绝对不能发生。如果查询因资源不足而无法运行,需要能够干净地终止查询,并且系统需要优雅地适应资源争用。
  • 高效地将表传输到数据库和从数据库传输出来至关重要。由于数据库和应用程序在同一进程中运行,因此它们共享同一个地址空间,这为高效数据共享提供了独特的机会,需要加以利用。
  • 实用的“可嵌入性”和便携性,数据库需要能够在宿主运行的任何环境中运行。在编译或运行时对外部库(例如openssh)的依赖已被证明是问题。禁止信号处理、调用exit()以及修改单一进程状态(如区域设置、工作目录等)。在本次演示中,我们展示了我们的新系统DuckDB的能力。DuckDB是一个新开发的专用嵌入式关系数据库管理系统。DuckDB作为开源软件,采用许可性MIT许可证发布。据我们所知,尽管存在上述明确的需求,但目前还没有专用的嵌入式分析数据库。DuckDB不是研究原型,而是为了广泛使用而构建的,每次提交都会运行数百万次测试查询,以确保SQL接口的正确操作和完整性。我们首次展示DuckDB,将其与其他系统在小型设备上进行对比。我们将允许观众增加处理的数据集大小,并观察随着数据集大小变化的CPU负载和内存压力等各种指标。这将展示DuckDB在分析嵌入式数据分析中的性能。

2. 设计与实现

DuckDB的设计决策是基于其预期用途:嵌入式分析。总体而言,我们遵循“教科书式”的组件分离:解析器、逻辑规划器、优化器、物理规划器和执行引擎。事务和存储管理器是正交的组件。尽管DuckDB是数据管理系统的一个新类别,但其任何一个组件本身都不是革命性的。相反,我们结合了最适合我们用例的最新技术和算法。作为一个嵌入式数据库,DuckDB没有客户端协议接口或服务器进程,而是通过C/C++ API进行访问。此外,DuckDB提供了一个SQLite兼容层,允许以前使用SQLite的应用程序通过重新链接或库重载来使用DuckDB。SQL解析器源自Postgres的SQL解析器,尽可能地进行了精简。这使得DuckDB拥有一个功能完备且稳定的解析器,以处理其输入中最易变化的形式——SQL查询。解析器以SQL查询字符串为输入,并返回一个C结构的解析树。然后,该解析树立即被转换为我们自己的C++类解析树,以限制Postgres数据结构的使用范围。这个解析树由语句(例如SELECT、INSERT等)和表达式(例如SUM(a)+1)组成。逻辑规划器由两部分组成:绑定器和计划生成器。绑定器解析所有引用架构对象(如表或视图)的表达式及其列名和类型。然后逻辑计划生成器将解析树转换为基本逻辑查询操作符(如扫描、过滤、投影等)的树。在规划阶段之后,我们得到了一个完全类型解析的逻辑查询计划。DuckDB对存储数据保持统计信息,这些统计信息作为规划过程的一部分在不同的表达树中传播。这些统计信息用于优化器本身,也用于在必要时通过升级类型来防止整数溢出。DuckDB的优化器使用动态规划进行连接顺序优化,对于复杂的连接图则使用贪婪回退。它还执行任意子查询的展平,如Neumann等人所述。此外,还有一组重写规则,通过执行例如公共子表达式消除和常量折叠来简化表达树。基数估计使用样本和HyperLogLog的组合来完成。这个过程的结果是查询的优化逻辑计划。物理规划器将逻辑计划转换为物理计划,选择适用的实现方式。例如,扫描可能会根据选择性估计决定使用现有索引而不是扫描基础表,或者根据连接谓词在哈希连接和合并连接之间切换。DuckDB使用向量化解释执行引擎。由于便携性原因,选择了这种方法而不是SQL查询的即时编译(JIT)。JIT引擎依赖于大型编译器库(例如LLVM)及其额外的传递依赖项。DuckDB使用固定最大值数量(默认为1024)的向量。固定长度类型(如整数)存储为本地数组。可变长度值(如字符串)表示为指向单独字符串堆的本地数组的指针。如果向量中出现NULL值,则使用单独的位向量表示NULL值,只有在向量中出现NULL值时才会存在。这允许快速交集NULL向量以进行二进制向量操作,并避免冗余计算。为了避免在过滤数据时(例如数据被过滤时)在向量内过度移动数据,向量可能具有选择向量,这是一个指向向量的偏移量列表,表明向量的哪些索引是相关的。DuckDB包含一个广泛的向量操作库,支持关系操作符,该库使用C++代码模板扩展所有支持的数据类型的代码。执行引擎以所谓的“向量火山”模型执行查询。查询执行从物理计划的根节点拉取第一块数据开始。一块是结果集、查询中间结果或基础表的水平子集。该节点将递归地从子节点拉取数据块,最终到达扫描操作符,扫描操作符通过从持久表中读取来生成数据块。这一过程一直持续到到达根节点的数据块为空,此时查询完成。DuckDB通过多版本并发控制(MVCC)提供ACID合规性。我们实现了HyPer的可序列化MVCC变体,该变体专门针对混合OLAP/OLTP系统进行了优化。这种变体立即在原地更新数据,并将以前的状态存储在单独的撤销缓冲区中,供并发事务和中止使用。由于DuckDB的主要用例是分析,但过去修改表的并行化仍然是一个常见需求,因此选择了MVCC,而不是更简单的方案,如乐观并发控制。对于持久化存储,DuckDB使用读优化的DataBlocks存储布局。逻辑表被水平分区为列的块,这些块使用轻量级压缩方法压缩成物理块。块为每一列携带最小/最大索引,允许快速确定它们是否与查询相关。

此外,每个块为每一列携带一个轻量级索引,这可以进一步限制扫描的值的数量。

图2:演示设置示意图


3. 演示场景

在我们的交互式演示场景中,我们希望展示DuckDB的两大优势:在有限硬件资源上处理大数据集的能力,以及嵌入式操作的优势。我们的演示设置在一个桌子上,上面有一个屏幕、一个大旋钮和四台相同的基准计算机。每台计算机运行不同的DBMS:SQLite、MonetDBLite、HyPer和DuckDB。每个数据库都预先加载了TPC-H基准表,因为观众可能对这个模式比较熟悉。计算机通过以太网连接到第五台“管理”计算机,可用于配置在四台基准计算机上重复运行的查询。屏幕上显示所有四台基准计算机的实时指标,至少包括查询完成率(QpS)和内存压力。桌子上的旋钮控制当前配置查询从事实表中读取的数据量。我们提出了两种演示场景:“预告”场景和“深入”场景。

对于“预告”场景,基准计算机上预先配置了一个合适的查询。观众将被邀请转动物理旋钮以增加/减少从事实表中读取的数据量。这将立即影响预配置查询的中间结果和结果集大小,也会立即影响屏幕上显示的指标。图2说明了这种设置。


4. 当前状态和下一步计划

截至本文撰写时,DuckDB已经运行了所有TPC-H查询和除两个之外的所有TPC-DS查询。我们预计在演示时将实现完整的TPC-DS覆盖。DuckDB还完成了SQLite的SQL逻辑测试套件中的大多数查询,该套件包含数百万个查询。DuckDB的下一步计划是完成DataBlocks存储方案和子查询折叠,目前这些功能正在开发分支中。缓冲管理器尚未实现,但将会实现。DuckDB已经支持查询间并行化,但查询内并行化也将被添加。我们计划实现一个工作窃取调度器,以在短查询和长查询之间平衡资源。一个特别的考虑是允许与宿主应用程序平衡资源使用,这是嵌入式操作的一个特殊问题。与MonetDBLite一样,我们将实现R和Python等数据库API。一个更先进的未来方向是自我检查。我们已经学会不信任数据库运行的硬件。这在边缘计算用例中尤其相关,因为硬件故障是常见的。一种方法是对所有持久化和中间数据保持校验和,并在校验扫描操作符上附加校验和验证。这可能不会对性能产生显著影响。向量化引擎特别适合这种操作,因为一块数据通常适合CPU缓存,额外的遍历不需要访问RAM。另一种增加对硬件信任的方法是受视频游戏开发者的启发,他们定期运行完整性检查计算,以确保CPU和RAM的正确运行。


致谢

我们感谢CWI数据库架构组以及所有过去、现在和未来的DuckDB贡献者。我们特别感谢TUM数据库组关于查询优化、窗口函数、存储和并发控制的论文,我们使用这些论文实现了DuckDB。


参考文献

Peter A. Boncz, Marcin Zukowski, 和 Niels Nes. 2005. MonetDB/X100: Hyper-Pipelining Query Execution. In CIDR 2005, Second Biennial Conference on Innovative Data Systems Research, Asilomar, CA, USA, January 4-7, 2005. 225–237. http://cidrdb.org/cidr2005/papers/P19.pdf
Lukas Fittl. 2019. C library for accessing the PostgreSQL parser outside of the server environment. https://github.com/fittl/libpg_query
Richard Hipp. 2019. Database File Format. https://www.sqlite.org/fileformat.html
Richard Hipp. 2019. Most Widely Deployed and Used Database Engine. https://www.sqlite.org/mostdeployed.html
Harald Lang, Tobias Mühlbauer, Florian Funke, et al. 2016. Data Blocks: Hybrid OLTP and OLAP on Compressed Storage using both Vectorization and Compilation. In Proceedings of the 2016 International Conference on Management of Data, SIGMOD Conference 2016, San Francisco, CA, USA, June 26 - July 01, 2016. 311–326. https://doi.org/10.1145/2882903.2882925
Wes McKinney. 2010. Data Structures for Statistical Computing in Python. In Proceedings of the 9th Python in Science Conference, Stéfan van der Walt and Jarrod Millman (Eds.). 51 – 56.
Guido Moerkotte 和 Thomas Neumann. 2008. Dynamic programming strikes back. In Proceedings of the ACM SIGMOD International Conference on Management of Data, SIGMOD 2008, Vancouver, BC, Canada, June 10-12, 2008. 539–552. https://doi.org/10.1145/1376616.1376672
Thomas Neumann. 2011. Efficiently Compiling Efficient Query Plans for Modern Hardware. PVLDB 4, 9 (2011), 539–550. https://doi.org/10.14778/2002938.2002940
Thomas Neumann 和 Alfons Kemper. 2015. Unnesting Arbitrary Queries. In Datenbanksysteme für Business, Technologie und Web (BTW), 16. Fachtagung des GI-Fachbereichs “Datenbanken und Informationssysteme” (DBIS), 4.-6.3.2015 in Hamburg, Germany. Proceedings. 383–402. https://dl.gi.de/20.500.12116/2418
Thomas Neumann, Tobias Mühlbauer, 和 Alfons Kemper. 2015. Fast Serializable Multi-Version Concurrency Control for Main-Memory Database Systems. In Proceedings of the 2015 ACM SIGMOD International Conference on Management of Data, Melbourne, Victoria, Australia, May 31 - June 4, 2015. 677–689. https://doi.org/10.1145/2723372.2749436
Thomas Neumann 和 Bernhard Radke. 2018. Adaptive Optimization of Very Large Join Queries. In Proceedings of the 2018 International Conference on Management of Data (SIGMOD ’18). ACM, New York, NY, USA, 677–692. https://doi.org/10.1145/3183713.3183733
Mark Raasveldt 和 Hannes Mühleisen. 2017. Don’t Hold My Data Hostage - A Case For Client Protocol Redesign. PVLDB 10, 10 (2017), 1022–1033. https://doi.org/10.14778/3115404.3115408
Mark Raasveldt 和 Hannes Mühleisen. 2018. MonetDBLite: An Embedded Analytical Database. CoRR abs/1805.08520 (2018). arXiv:1805.08520 http://arxiv.org/abs/1805.08520
Hadley Wickham, Romain François, Lionel Henry, 和 Kirill Müller. 2018. dplyr: A Grammar of Data Manipulation. https://CRAN.R-project.org/package=dplyr R package version 0.7.8.

起飞了 ! 使用 DuckDB 的处理11 亿出租车出行数据 如果您想知道为什么我不运行基于 Linux 的桌面作为我的主要工作环境,我仍在使用 Nvidia GTX 1080 GPU,它在 Windows 上有更好的驱动程序支持,并且我时不时地使用 ArcGIS Pro仅原生支持 Windows。SSD 的写入速度为 50-150 MB/s,读取速度通常为 5-10 MB/s,而 CPU 几乎处于空闲状态,为 5-10%。因此,我将在更快的驱动器上运行基准测试,但我将在更便宜的驱动器上构建 Parquet 文件。它不依赖于自己的服务器,而是用作客户端。 阅读详情

相关推荐

最火数据库 DuckDB简介:数据分析的利器

DuckDB是一款新兴的高性能嵌入式SQL数据库,专为在线分析处理(OLAP)设计,被誉为"分析型的SQLite"。它采用列式存储和向量化查询引擎,显著提升了数据分析查询性能,支持标准SQL语法和多种数据格式导入。与SQLite相比,DuckDB更擅长处理大规模数据集的聚合和复杂计算,但不适合事务密集型场景。DuckDB安装简单,能与Python、R等语言深度集成,是数据分析师、科学家处理交互式分析、边缘计算等任务的理想工具。虽然存在单机运行、非事务型等局限,但其优异的性能和易用性使其成

四楼没电梯的专栏 4360

DuckDB全面挑战SQLite

如果查看 DuckDB 的网站,在其主页上看到的第一件事就是:DuckDB 是一个进程内 SQL OLAP 数据库管理系统。让我们尝试解读这句话,因为它包含相关信息。• 进程内 SQL 意味着 DuckDB 的功能在应用程序中运行,而不是在应用程序连接的外部进程中运行。换句话说:没有客户端发送指令,也没有服务器读取和处理它们。与 SQLite 的工作方式相同,而 PostgreSQL、MySQL……则不然。• OLAP 代表在线分析处理,微软将其定义为组织大型业务数据库并支持复杂分析的技术。

Rocky006的博客 7519

MacOS上VScode配置PlatformIO Core的疑难杂症与提速实战

本文详细解析了在MacOS上使用VScode配置PlatformIO Core时遇到的安装卡死、新建项目缓慢等常见问题,并提供了官方脚本安装、网络优化、命令行预下载等实用解决方案。通过环境变量配置和镜像源加速,大幅提升开发效率,特别适合ESP32等嵌入式开发场景。

weixin_42567046的博客 220

DuckDB入门

DuckDB客户端(或前端)↓ 本地文件访问DuckDB 文件数据库项目是否具备❌ 无官方 Chart嵌入式部署✅ 支持REST 接口服务✅ 推荐自行封装K8s 运行支持✅ 可运行 API 容器持久化支持✅ 使用 PVC 存储.duckdb文件。

喝醉酒的小白 2905

保姆级教程:用Wokwi玩转ESP32 MicroPython仿真(含库文件配置指南)

本教程详细介绍了如何使用Wokwi平台进行ESP32 MicroPython仿真开发,包括库文件配置、传感器数据模拟和REPL调试技巧。通过Wokwi的仿真调试系统,开发者可以在浏览器中快速验证代码逻辑,提高开发效率,特别适合物联网项目的快速迭代。

weixin_29195615的博客 442

面试中常考的数学题——截木棍、圆上取点、赛马、红蓝墨水,测试毒药、坐到正确座位问题

文章目录1.将一根木棒截成三段,问能够组成三角形的概率;2.在圆上任取三点,问能够组成锐角、直角、钝角三角形的概率;3.共有25匹马,找出最快的3匹,只有5个赛道,每次比赛只能得到5匹马的速度排序,最少需要多少次比赛;4 有两瓶红蓝墨水,体积一样,现在从红墨水中舀一勺加入蓝墨水中,搅拌均匀后,在从蓝墨水中舀一勺加到红墨水中,试问这两瓶墨水哪瓶纯度更高。 1.将一根木棒截成三段,问能够组成三角形的概率; 来源:https://blog.youkuaiyun.com/weixin_41245919/article/deta

weixin_41558411的博客 4904

嵌入式分析型数据库(DuckDB)

DuckDB是一款集轻量级、高性能于一体的嵌入式分析型数据库。在单机内存不断增大以及 SSD 存储逐渐普及的背景下,大部分数据处理工作可以在单机上完成,且很多 OLAP(在线分析处理)场景也能在单机上进行。DuckDB 就是为了满足这种在单机环境下进行高效数据分析的需求而诞生的。它是荷兰 CWI 数据库组的一个项目,学术气息浓厚,架构清晰,适合学习和研究。

weixin_43156294的博客 3001

JDK8升级JDK17过程中遇到的那些坑

JDK8虽然非常好,但是JDK版本已经发布到JDK20了,且JDK8后的版本升级了很多新的特性,如模块化、ZGC以及虚拟线程、结构性并发等,也是非常有吸引力的,所以决定将基于JDK8的项目升级到最近的LTS版本JDK17。

BASK2312的博客 6684

开源的嵌入式分析型数据库duckdb介绍及下载

DuckDB 是一个开源的嵌入式分析型数据库,专为数据分析和处理大规模数据集设计,具有高性能、轻量级和易嵌入的特点。定位:DuckDB 是一个面向分析型工作负载(OLAP)的列式存储数据库,类似于 SQLite 的 OLTP 数据库,但专注于快速执行复杂查询(如聚合、连接、过滤等)。嵌入式:无需单独的服务器进程,DuckDB 直接嵌入到应用程序中,运行在客户端进程内,减少了网络开销。目标:为数据科学家、分析师和开发者提供一个高效、简单易用的工具,适合处理本地或嵌入式场景的分析任务。

GIS工具 2043

MYSQL、ORACLE、PostgreSQL数据库对象层次及权限管理对比

本文为出于自己扩展、比较、图形化的思维路径自行总结归纳,可能有些细节不太准确,欢迎指正。MySQL、Oracle、PostgreSQL关系型数据库都有管理员用户、用户、权限管理、表函数索引等数据库对象,schema。但在数据库对象隶属层次上有差异和相同的地方。

rachel_2016的博客 1489

R语言下载包报错?可能是IE浏览器在搞鬼!手把手教你修复(附CRAN镜像选择指南)

本文深入解析了R语言下载包时常见的网络报错问题,特别是Windows系统中因Internet Explorer代理设置导致的连接失败。文章提供了从重置IE配置、排查防火墙到优化CRAN镜像选择的完整解决方案,并附有详细的配置指南和自动化诊断脚本,帮助用户彻底解决R包安装难题。

weixin_29056781的博客 741

DuckDB:重新定义嵌入式分析型数据库的性能边界

在当今数据驱动的时代,传统的数据库架构往往难以平衡性能、易用性和部署灵活性。DuckDB作为一款**内存分析型数据库管理系统**,通过创新的架构设计打破了这一困境。它采用**向量化执行引擎**和**列式存储模型**,在保持完整SQL支持的同时,实现了远超传统数据库的查询性能。无论是处理大规模数据集还是进行实时分析,DuckDB都能提供**零配置、轻量级**的解决方案,彻底改变了数据分析工作流的复杂

gitblog_00887的博客 724

开源大语言模型GLM-5:从架构解析到部署微调全指南

大语言模型(LLM)作为当前人工智能领域的核心技术,通过海量数据预训练获得强大的语言理解和生成能力。其核心原理基于Transformer架构,通过自注意力机制捕捉长距离依赖关系,在通用语言任务上展现出卓越性能。这一技术价值在于为开发者提供了强大的基座模型,能够通过微调快速适配特定领域需求,显著降低AI应用开发门槛。在实际应用场景中,大模型被广泛用于智能对话、代码生成、内容创作等任务。本文以开源项目GLM-5为例,深入探讨其架构特点,并详细介绍了如何使用LoRA技术进行参数高效微调,以及通过量化优化实现模型在

weixin_28683165的博客 350

如何快速上手DuckDB:高性能嵌入式分析型数据库完整指南

DuckDB是一款**高性能嵌入式分析型SQL数据库管理系统**,旨在提供快速、可靠、便携且易用的数据分析体验。它支持丰富的SQL方言、复杂数据类型(数组、结构体、映射)和多种扩展功能,可通过命令行界面或Python、R、Java等客户端集成使用,是数据分析爱好者和开发者的理想选择。 ## ???? 核心功能亮点:为什么选择DuckDB? DuckDB凭借以下特性在众多数据库中脱颖而出: - *...

gitblog_01080的博客 1307

“快速掌握Vivado FPGA开发流程“——详解Vivado开发流程及实例

快速掌握Vivado FPGA开发流程”——详解Vivado开发流程及实例FPGA技术在现代电子领域中应用越来越广泛,而Vivado作为业界最流行的FPGA设计工具之一,也受到越来越多人的关注和使用。那么如何快速掌握Vivado FPGA开发流程呢?本文将详细介绍Vivado开发流程,并通过实例来加深您的理解。首先,我们需要了解Vivado开发流程的主要步骤:创建工程、设计电路、约束电路、生成比特流。接下来,让我们一步步了解这些步骤。

2301_78484069的博客 731

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

DuckDB 快速上手指南:三步跑通本地分析型 SQL 数据库

DuckDB 是一个进程内(in-process,即嵌在你的程序里跑、不需要独立服务进程)的分析型 SQL 数据库。本地有几个大 CSV 想跑复杂查询,又不想装一套要维护的数据库服务器?DuckDB 就是为这种场景设计的:标准 SQL、窗口函数、数组/结构体/映射等复杂类型全都支持,命令行、Python、C/C++ 程序里都能直接用。 ## 不想装服务器?它直接跑在你的进程里 传统用法里,"数

gitblog_01055的博客 858

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

DuckDB 闪电般快速的嵌入式分析型数据库管理系统

DuckDB 是一个强大的工具,特别适合需要高效处理分析型查询的场景。它的轻量级设计和易用性使其成为数据科学家、分析师和开发者的理想选择。如果你需要处理大规模数据或执行复杂查询,DuckDB 是一个值得尝试的解决方案。

skywalk8163的专栏 1414

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

DuckDB 从零上手指南:进程内分析型 SQL 数据库,从构建到第一条查询

DuckDB 是一个高性能的进程内(in-process)分析型 SQL 数据库管理系统,专为 OLAP 场景设计:你不需要部署服务器、配置端口,只需把 SQL 写进自己的应用进程,就能对内存数据和 CSV、Parquet 等文件直接做分析查询。它适合数据分析师、数据工程师以及需要给现有应用快速加上 SQL 分析能力的开发者。 ## 为什么选 DuckDB 传统分析流程里,"跑一个聚合查询"往

gitblog_00869的博客 754

DuckDB 是什么及适用场景

新钛云服已累计为您分享800篇技术干货DuckDB 是什么DuckDB 是一款集轻量级、高性能于一体的嵌入式分析型数据库,以其卓越的数据查询和分析能力在数据库领域崭露头角。这款基于C++ 编写的数据库,以其先进的设计理念和高效的存储引擎,为大规模数据处理提供了强有力的支持。DuckDB 采用了独特的列式存储方式,相较于传统的行式存储,这种存储方式能更加高效地读取和分析数据。通过将相同列的数据集中...

NewTyun的博客 2375

duckdb介绍

DuckDB 是一个开源的嵌入式分析型 SQL 数据库管理系统,专为高性能分析查询设计。其特点包括嵌入式运行、列式存储、无服务器架构和易于使用。DuckDB 直接运行在应用程序进程内,无需独立服务器,适合处理复杂查询和大规模数据分析,但不适合高频事务处理。它支持多种编程语言,并与数据科学工具如 Pandas 和 Apache Parquet 无缝集成。应用场景包括数据分析、数据仓库、嵌入式数据库、数据科学、IoT 和日志分析。安装简单,通过 pip 即可在 Python 环境中使用。示例代码展示了如何在 D

lagrahhn的博客 1235

DuckDB 分析型数据库:本地 SQL 实战指南

DuckDB 是进程内分析型数据库:单进程运行,用 SQL 直接查询 CSV、Parquet 等本地文件,并提供 Python、C++ 等语言绑定。 ## DuckDB 是什么 & 为什么用它 DuckDB 的核心是一个跑在你进程里的 SQL 引擎,不部署服务器、不起常驻服务,跑一个可执行文件就能用。它采用列式存储加向量化执行,专为单机上快速分析大量数据设计。适合需要在本地数据上做分析、或想给

gitblog_00240的博客 391

DuckDB 快速上手指南:三步跑起一个进程内分析型数据库

DuckDB 是一款嵌入式的进程内分析型数据库,SQL 引擎直接跑在你的程序里,不需要独立服务器,也不用搬数据。适合数据分析师、ETL 开发者,以及想在本地快速算数据的所有人。 [![DuckDB 进程内分析型数据库](https://raw.gitcode.com/GitHub_Trending/du/duckdb/raw/d22e92fd82b9c964e05d31456e02ae979f0

gitblog_00681的博客 374

DuckDB 分析型数据库完整指南:把 GB 级数据查询搬进你的笔记本

想在本地跑完 GB 级的数据查询,却不想搭集群、装服务、写运维脚本?DuckDB 是一个进程内分析型数据库(in-process,即数据库直接运行在你的程序进程里,不需要独立服务端),用标准 SQL 就能直接查 CSV、Parquet 文件和内存中的 DataFrame,性能对标专业 OLAP 系统。下面从定位、能力、生态到上手,带你 10 分钟建立完整认知。 ## 一、定位:DuckDB 分析

gitblog_00249的博客 674

DuckDB 完全上手:三步把分析型 SQL 数据库嵌进你的程序

DuckDB 是一个"进程内"(in-process)的分析型 SQL 数据库管理系统,通俗说:它不是你要去连接的一台远端数据库服务器,而是像库一样直接跑在你自己程序里的数据库引擎。它专为数据分析场景优化,适合想在本地快速查询 CSV、Parquet 等数据文件的开发者、数据分析师,以及需要给产品内嵌查询能力的 C++ 工程师。 ## 📌 它解决什么问题:把数据库装进你的进程里 传统做法是起

gitblog_00665的博客 384

awesome-duckdb:一款优秀的分析型SQL数据库管理系统

在现代数据分析领域,拥有一个高效、轻量级的数据库管理系统至关重要。awesome-duckdb 是一个精选的列表,包含与 DuckDB 相关的库、工具和资源。DuckDB 是一个分析型 in-process SQL 数据库管理系统,它设计用于嵌入应用程序中,以支持快速的数据分析和查询。 ## 项目技术分析 DuckDB 的核心特点是在进程内执行,这意味着它不需要网络通信,从而大大减少了延迟。它...

gitblog_00799的博客 729

DuckDB完整指南:如何快速掌握这款免费的分析型数据库

DuckDB是一款专为数据分析而设计的嵌入式数据库系统,以其卓越的性能和易用性在数据科学领域广受欢迎。作为内存优化的OLAP数据库,DuckDB能够处理复杂的SQL查询,支持窗口函数、嵌套查询和复杂数据类型,让数据分析工作变得轻松高效。 ## 为什么选择DuckDB进行数据分析 **极速查询性能**是DuckDB最大的亮点。通过优化的向量化执行引擎,DuckDB在处理大规模数据集时展现出惊人的

gitblog_01171的博客 700
上一篇: 监督微调(SFT):自然语言处理中的精细化调优技术
Whoisbug
博客等级 码龄9年 894粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值