提升 Apache Hudi Upsert 性能的三个建议

Apache Hudi 社区一直在快速发展,各公司正在寻找方法来利用其强大的功能来有效地摄取和管理大规模数据集。 每周社区都会收到一些常见问题,最常见的问题与 Hudi 如何执行更新插入有关,以确保以低延迟访问最新数据。

选择合适的存储表类型

快速更新插入的主要考虑因素之一是选择正确的存储表类型。 Hudi 支持两种不同的存储表类型——Copy-On-Write (COW) 和 Merge-On-Read (MOR)。 由于处理数据更新的方法不同,每种表类型都会对 upsert 性能产生不同的影响。

COW表

与 MOR 表相比,COW 表的操作更简单,因为所有更新都写入 Apache Parquet 格式的基础文件。不需要运行像压缩这样的单独服务来管理任何日志文件以提高读取或存储效率。COW通过完全重写文件以生成新版本的基本文件来处理更新。 因此 COW 表表现出更高的写放大,因为创建新的基本文件版本会进行同步合并。 然而 COW 表的一个关键优势是它们的零读取放大,因为所有数据都在基础文件中可用,随时可以读取。 查询所需的磁盘读取很少,因为它们不需要读取多个位置或合并数据。

MOR表

与 COW 表相比,MOR 表具有更高的操作复杂性。 MOR 不会重写整个文件,而是将更新写入单独的日志文件,然后这些日志文件稍后与基本文件合并为一个新的文件版本,这是通过压缩服务完成的。 需要压缩来限制日志文件的增长,这样查询性能就不会下降并优化存储。

直接写入日志文件避免了多次重写整个基本文件,从而降低了写入放大——如果正在处理流数据,这种差异就会变得很明显,也就是说 MOR 表进行了写入优化。 但是由于需要读取基本文件和日志文件并动态合并数据,MOR 表在压缩之间对快照查询有更高的读取放大。

COW 和 MOR 表的注意事项

如果更新插入比率很高并且对摄取延迟很敏感,那么更适合使用 MOR 表。 如流数据源——通常会希望更快地根据洞察采取行动,以便为用户提供相关和及时的信息。 但是如果工作负载更多地基于插入,并且可以容忍合理的摄取延迟,那么更适合使用 COW 表。

根据记录键选择正确的索引类型

通过利用索引,Hudi 在更新插入期间查找记录时避免全表扫描,这比较耗费时间和资源。 Hudi 的索引层将记录键映射到相应的文件位置,索引层是可插拔的,有多种索引类型可供选择。 需要考虑的是索引延迟取决于多种因素,例如正在摄取多少数据、表中有多少数据、是否有分区表或非分区表、选择的索引类型、工作负载的更新程度和记录键的时间特性。 根据所需的性能和唯一性保证,Hudi 提供了不同的开箱即用的索引策略,可以分为全局或非全局索引。

全局与非全局索引

  • 非全局索引:Hudi 确保一对分区路径和记录键在整个表中是唯一的。 索引查找性能与正在摄取的传入记录之间的匹配分区的大小成正比。 ‍

  • 全局索引:该索引策略在表的所有分区中强制执行键的唯一性,即保证对于给定的记录键,表中恰好存在一条记录。 全局索引提供了更强的保证,但是更新/删除成本随着表的大小而增长。

由于唯一性保证的差异,全局与非全局之间的主要考虑因素之一与索引查找延迟有关:
非全局索引仅查找匹配的分区:例如如果有 100 个分区并且传入的批处理仅包含最后 2 个分区的记录,则只会查找属于这 2 个分区的文件组。 对于大规模的更新插入工作负载可能需要考虑非全局索引,例如非全局布隆、非全局简单索引和桶索引。
全局索引查看所有分区中的所有文件组:例如如果有 100 个分区并且传入的记录批次中有最后 2 个分区的记录,则将查找所有 100 个分区中的所有文件组(因为 Hudi 必须保证整个表中只有一个版本的记录键)。 这会增加大规模更新插入工作负载的延迟。

Hudi 提供开箱即用的索引类型

  • 布隆索引:这是一种索引策略,可以有效地管理文件组中的更新插入和记录查找。 该索引利用布隆过滤器,这是一种概率数据结构,有助于确定给定记录键是否存在于特定文件组中。适用于全局和非全局索引。

  • 简单索引:这是一种索引策略,它提供了一种将记录键映射到其相应文件组的直接方法。它针对从存储表中提取的键执行传入更新/删除记录的连接。适用于全局和非全局索引。

  • HBase索引:该索引策略使用HBase存储索引来映射记录键及其在文件组中对应的文件位置。 适用于全局索引。

  • 桶索引:这是一种索引策略,它使用散列将记录路由到静态分配的文件组。 适用于非全局索引。

  • 一致性哈希桶索引:这是一种索引策略,是桶索引的高级版本。 虽然桶索引需要为每个分区预先分配文件组,但使用一致的哈希索引可以根据负载动态地增加或收缩每个分区的文件组。 适用于非全局索引。

更新密集型工作负载要考虑的索引类型

  • Bloom 索引:如果记录键按某些标准(例如基于时间戳)排序并且更新与最近的数据集相关,那么这对于更新繁重的工作负载是一个很好的索引策略。 例如如果记录键是根据时间戳排序的,并且我们在最近几天更新数据。
    • Bloom 索引用例:假设每 10 分钟就会摄取一批新数据。 我们假设新批次包含最近 3 天内的数据更新。 Hudi 根据布隆索引,识别出文件组中的候选更新记录,并从基础文件页脚中获取布隆过滤器,进一步裁剪文件组中每个文件中要查找的记录。 如果没有找到记录则被视为插入。‍
  • 简单索引:如果偶尔更新整个表范围内的文件并且记录键是随机的,即不基于时间戳,那么这对于更新繁重的工作负载是一个很好的索引策略。
    • 简单索引用例:如果有一个维度表,其中记录键是旅行 ID(随机 UUID)并且分区是按城市 ID。 如果我们要更新分布在一系列城市的 10000 条行程,Hudi 首先根据传入的城市 ID 识别相关分区。 Hudi 通过执行连接有效地找到包含记录的文件。
  • 桶索引:如果每个分区存储的数据总量在所有分区中都相似,这是一个很好的索引策略。 每个分区的桶(或文件组)数量必须预先为给定的表定义。更多细节参考如下文档。
    • 桶索引用例:当定义桶数量后,Hudi会对记录键应用一个哈希函数来将记录均匀地分布在桶中。 哈希函数将每个记录 ID 分配给一个桶号,当更新时 Hudi 将哈希函数应用于记录 ID 并确定相应的桶,然后 Hudi 将写入委托给相应的桶(文件组)。

分区路径粒度

分区是一种技术,用于根据数据集中的某些属性或列将大型数据集拆分为较小的、易于管理的部分。 这可以大大提高查询性能,因为在查询期间只需要扫描数据的一个子集。 然而分区的有效性在很大程度上取决于分区的粒度。

一个常见的误区是将分区设置得过于精细,例如按 <city>/<day>/<hour> 划分分区。 根据工作负载每小时粒度的数据可能不足,从而导致许多只有几千字节的小文件。 如果小文件越多,磁盘寻道成本就越高,查询性能就会下降。 其次在摄取方面,小文件也会影响索引查找,因为修剪不相关文件需要更长的时间。 根据正在使用的索引策略,这可能会影响写入性能。因此建议用户始终从较粗糙的分区方案开始,如 / 以避免小文件的问题,如果仍然觉得需要粒度分区,可以根据查询模式重新评估分区方案和/或可以潜在地利用Clustering服务来平衡摄取和查询性能。

PS:如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”,将会是我不竭的动力!
作者:leesf    掌控之中,才会成功;掌控之外,注定失败。
出处:http://www.cnblogs.com/leesf456/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如果觉得本文对您有帮助,您可以请我喝杯咖啡!

本文转载于网络 如有侵权请联系删除

相关文章

  • Numpy核心语法和代码整理汇总!

    Numpy汇总Numpy是一个用python实现的科学计算的扩展程序库,包括:一个强大的N维数组对象Array;比较成熟的(广播)函数库;用于整合C/C++和Fortran代码的工具包;实用的线性代数、傅里叶变换和随机数生成函数。numpy和稀疏矩阵运算包scipy配合使用更加方便。NumPy(NumericPython)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。多为很多大型金融公司使用,以及核心的科学计算组织如:LawrenceLivermore,NASA用其处理一些本来使用C++,Fortran或Matlab等所做的任务。本文整理了一个Numpy的小抄表,总结了Numpy的常用操作,可以收藏慢慢看。(图片可以点开大图查看哦~)1、安装Numpy可以通过Pip或者Anaconda安装Numpy:$pipinstallnumpy复制或$condainstallnumpy复制2、基础NumPy最常用的功能之一就是NumPy数组:列表和NumPy数组的最主要区别在于功能性和速度。列表提供基本操作,但NumPy添加了FTTs、卷

  • S7-1200与迈凯诺变频器进行modbus RTU进行通讯

    一、组态PLC:打开博图V15软件,新建项目,进行PLC的硬件组态,在CPU的左侧添加CM1241modbusRTU通讯模块。二、组态通讯端口双击CM1241modbusRTU通讯模块,在下方“RS422/485接口”选项下,点击“端口组态”,右侧设置如下:协议---自由口;操作模式--半双工(RS485)2线制模式;接收线路初始状态--无;波特率--9600、奇偶校验--无、数据位--8位/字符、停止位--1;其余默认;如图1、图2所示:图1图2三、设置CPU系统和时钟存储器双击CPU,点击“系统和时钟存储器”,点击右侧“启用系统存储器字节”和“启用时钟存储器字节”,用于编程时使用首次扫描位和时钟脉冲;如图3图3四、新建读写数据块新建读写全局数据块DB3、DB5,数据块里新建数据类型为UINT的数组;如图4图4五、编写modbusRTU初始化程序在OB1里,编写modbusRTU初始化程序,点击右侧“通信”--“通信处理器”--“MODBUS(RTU)”--“Modbus_Comm_Load”,拖拽到程序段1中,自动生成背景数据块;Modbus_Comm_Load模块的引脚说明:EN

  • 国内首例!医疗AI公司遭黑客入侵,新冠产品源码及用户数据被窃,暗网21万打包出售

    作者:刘俊寰、曹培信美国当地时间25日,网络安全平台Cyble在推特上曝出,一位名叫THE0TIME的黑客黑进了慧影医疗科技(北京)有限公司(下称“汇医慧影”)的系统,将公司内部的新冠检测技术和数据在暗网上以4比特币(约合3万美元、21万人民币)的价格公开出售。该黑客表示,已经获得对汇医慧影新冠检测技术和数据的访问权,包括150MB的新冠病毒研究成果信息、1GB的技术相关内容和源代码、1.5MB的用户数据。不仅如此,黑客还公布了部分数据样本:这也是国内首家被曝数据泄露的医疗人工智能公司案例。从数据量大小来看,最受关注的患者隐私数据并没有被大规模泄露,黑客获取的更多是新冠相关技术的产品源码和研究成果,比较大的可能是黑客非法进入了某研究人员的系统,并从中获取了研究数据。尽管如此,作为对隐私保护关注度极高的医疗影像行业,这样一件黑客事件的发生依然引发了业内的担忧。文摘菌也就此联系了几位医疗影像从业者,同样从事医疗影像行业的某公司高管表示事件可能没有想象中这么严重,毕竟用户数据并没有被泄漏。但是也同时对泄漏规模表示担忧,“从曝出的数据样本来看,不排除整个服务器遭遇攻击的情况,如果产品源码被整体

  • Spark系列--OutputFormat 详解

    前言本文主要内容什么是OutputFormat及其运行机制?如何自定义自己的OutputFormat?实战自定义mysqlOutputFormat。一丶什么是OutputFormat?定义了spark的输出规则的类。这也许会让你想到HadoopMapreduce的OutputFormat,没错,其实他们是一个东西,嗯,完全一样。Spark本身只是一个计算框架,其输入和输出都是依赖于Hadoop的 OutputFormat,但是因为Spark本身自带Hadoop相关Jar包,所以不需要我们额外考虑这些东西,下面我们以saveAsTextFile源码来验证我们的结论defsaveAsTextFile(path:String):Unit=withScope{ valnullWritableClassTag=implicitly[ClassTag[NullWritable]] valtextClassTag=implicitly[ClassTag[Text]] valr=this.mapPartitions{iter=> valtext=newText() iter.map{x=>

  • AI大事件丨中国的AI启动资金超过美国,JupyterLab上线,用少量样本实现语音克隆

    呜啦啦啦啦啦小伙伴们大家好呀,沉寂一个春节的AI大事件又开始更新啦!过去的一周中AI圈都发生了什么?大佬们讨论了哪些问题?研究者们发布了哪些值得一读的论文?又有哪些开源的代码和数据库可以使用了?快快跟随文摘菌盘点过去一周AI大事件!新闻JupyterLab已上线来源:BLOG.JUPYTER.ORGJupyterLab是面向研究人员和数据科学家的流行笔记本工具Jupyter的下一代基于Web的界面。随着最新版本的发布,JupyterLab现在可以用于日常研究工作。中国的AI启动资金超过美国来源:WWW.THEVERGE.COM链接:https://www.theverge.com/2018/2/22/17039696/china-us-ai-funding-startup-comparison?utm_campaign=Revue%20newsletter&utm_medium=Newsletter&utm_source=The%20Wild%20Week%20in%20AI根据CBInsights的数据,在对AI初创公司的资助上,中国已经超越美国成为世界第一大国。20

  • 百度调整架构从两年一次到一年三次,战时状态的必然

    百度今天宣布进行架构大调整,距离上次调整刚刚过去4个月,距离上上次调整刚好过去1年。如此频繁地进行架构调整在百度历史上十分罕见。在2015年之前的一次调整是2013年,再上一次调整是2011年,2015年2月以来百度已调整架构达3次之多。从两年一次调整到现在一年三次调整,足见百度现在的状态变化之大。 百度架构大调整的三个看点上图为百度在2015年底架构调整之后的架构,腾讯科技制图上图为百度在本次架构调整之后的架构,腾讯科技制图本次调整相对于上次调整更加“剧烈”。上次调整最大变化是成立了“金融服务事业群组”,由原负责大市场公关业务的副总裁朱光负责。而这次调整最大看点是,百度将搜索业务群组和移动服务事业群组合二为一,成立“百度搜索公司”,而将搜索和服务分开是在2015年2月。这至少说明了几点:第一:百度将移动端和PC端业务融合在一起发展,以加强协同。连接人与信息,和连接人与服务在过去由不同业务部门负责。信息是百度的大本营业务,服务化主要由移动端负责,现在移动和PC合二为一,均在搜索公司,更有利于PC和移动、信息和服务的协同,事实上,PC和移动,信息和服务本身关系就十分密切。这表明移动化已经

  • 只需4招,教你轻松打造更高效的开放数据项目

    美国很多地方政府都制定了开放式数据战略帮助他们增强政府公信力、提高政务透明度,同时也提高了民众的参与度,扩大了民众获取信息的渠道。这种“开放式数据战略”在美国经过快速发展正变得随处可见。今年2月初,美国新泽西州州长ChrisChristie签署法规,要求该州所有政府机构执行透明化办公,公开政务信息。此外,加州萨利纳斯市引入了价值230万美元的文件管理系统,正式开始实施开放数据和民众监督战略,保障该市及其周边地区的安全。该项目旨在以一种更公开、更可行的方式发布该市政府网站的信息,引导民众积极参与监督政府工作。这就需要实施开放数据政策。“当今的时代是大数据和开放数据的时代。说到开放数据战略,很多人想到的是那些国际化的大城市,比如上海、伦敦、洛杉矶或者旧金山,事实上,现在这一趋势已经从大城市蔓延到中小城市了。”萨利纳斯市执政官RayCorpuzJr.在发布会上介绍道。随着越来越多的城市开始实施开放数据战略,我们有必要了解如何才能更安全、更高效地开展开放数据项目。1.任命靠谱首席数据官,把握项目发展方向新泽西州的开放数据计划并不仅仅是针对新的数据共享标准制定了相关法规,而且还确立了首席数据官的

  • 创建弹窗

    <!DOCTYPEhtml> <html> <head> <metacharset="utf-8"> <title></title> <linkrel="stylesheet"href="css/animate.min.css"/> <scripttype="text/javascript"src="js/jquery-1.11.1.min.js"></script> <style> html,body{ margin:0px; min-height:100%; width:100%; } .warp{ width:500px; height:300px; border-radius:10px; background:brown; margin:0pxauto; margin-top:30px; box-shadow:0px0px40px0pxwhite; } .mas

  • Elastic 技术栈之 Logstash 基础

    Elastic技术栈之Logstash基础本文是Elastic技术栈(ELK)的Logstash应用。 如果不了解Elastic的安装、配置、部署,可以参考:Elastic技术栈之快速入门 简介Logstash可以传输和处理你的日志、事务或其他数据。功能Logstash是Elasticsearch的最佳数据管道。Logstash是插件式管理模式,在输入、过滤、输出以及编码过程中都可以使用插件进行定制。Logstash社区有超过200种可用插件。工作原理Logstash有两个必要元素:input和output,一个可选元素:filter。这三个元素,分别代表Logstash事件处理的三个阶段:输入>过滤器>输出。input负责从数据源采集数据。filter将数据修改为你指定的格式或内容。output将数据传输到目的地。在实际应用场景中,通常输入、输出、过滤器不止一个。Logstash的这三个元素都使用插件式管理方式,用户可以根据应用需要,灵活的选用各阶段需要的插件,并组合使用。后面将对插件展开讲解,暂且不表。设置设置文件logstash.yml:logstash的默认启动配置

  • Python: 通过Ghostscript压缩pdf文件

    文章背景:为了文件传输的方便,有时需要对pdf文件进行压缩。针对pdf压缩,一种方法是借助PYMUPDF第三方库函数进行图片提取和压缩,最后合并生成一个新的PDF。该方法并非对所有pdf文件都适用,且压缩后的pdf画质可能会变差。本文借助Ghostscript对pdf文件进行压缩。因此,电脑上需要事先安装Ghostscript软件。Ghostscript是一套建基于Adobe、PostScript及可移植文档格式(PDF)的页面描述语言等而编译成的自由软件。许可协议有两个:GNU通用公共许可协议(免费,GPLGhostscript),AladdinFreePublicLicense(收费)。代码1:(pdf_compressor.py)#!/usr/bin/envpython3 #Author:Theeko74 #Contributor(s):skjerns #Oct,2021 #MITlicense--freetouseasyouwant,cheers. """ Simplepythonwrapperscripttouseghoscriptfuncti

  • glibc 误升级后修复

    起因#在使用cephadm安装cephv16.2时升级了python,系统默认版本是3.7.4,升级后版本是3.8.5,glibc作为依赖同时进行了升级,系统默认版本是2.28,升级后版本是2.31,幸好记录及时,截图留存了软件包升级信息,如下在没有十分把握的情况下不要用yuminstall-y,使用yuminstall先判断好依赖安装带来的影响 升级过程未出任何问题,便没在意,可是后续openssh由于glibc的升级导致连接失败,一番baidu加google未解决openssh连接问题,于是便着手开始降级glibc至系统默认版本,从系统镜像中找到glibc相关的三个软件包由于是版本降级,脑子一热便采用rpm-Uvh--nodepsglibc*方式强制安装,至此,系统崩溃系统几乎所有命令都无法使用,报错如下出现这个问题的原因大致是因为强制安装并未完全成功,lib64一些相关的库文件软链接丢失[root@localhost~]#ls-l/lib64/libc.so.6 lrwxrwxrwx1rootroot127月1414:43/lib64/libc.so.6->libc-2.2

  • 什么是根号?什么是 log ?

    生日悖论是\(O(\sqrt{n})\) 随机序列LIS是\(O(\sqrt{n})\) 随机\(\pm1\)序列前缀和最大绝对值是\(O(\sqrt{n})\)证明 随机Prufer序列树树高是\(O(\sqrt{n})\) \(\suma_i=n\)的背包问题二进制分组是\(O(n\sqrt{n})\)(不带\(\log\)) 最小原根是\(O(\sqrt[4]{n})\) 随机序列前缀最大值个数是\(O(\log{n})\) 随机父亲树高与最大度数都是\(O(\log{n})\) 两维值域\(W\)凸包整点集大小至多为\(O(W^{2/3})\)

  • 使用Servlet实现用户注册

    1、用户注册页面代码 <%@pagelanguage="java"contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"> <title>Inserttitlehere</title> </head> <body> <formaction="yhzhuce"method="post"> <tablealign="center"border="1"weight="200"height="200"> <tralign="ce

  • linux 命令大全记录

    系统信息arch显示机器的处理器架构(1)uname-m显示机器的处理器架构(2)uname-r显示正在使用的内核版本dmidecode-q显示硬件系统部件-(SMBIOS/DMI)hdparm-i/dev/hda罗列一个磁盘的架构特性hdparm-tT/dev/sda在磁盘上执行测试性读取操作cat/proc/cpuinfo显示CPUinfo的信息cat/proc/interrupts显示中断cat/proc/meminfo校验内存使用cat/proc/swaps显示哪些swap被使用cat/proc/version显示内核的版本cat/proc/net/dev显示网络适配器及统计cat/proc/mounts显示已加载的文件系统lspci-tv罗列PCI设备lsusb-tv显示USB设备date显示系统日期cal2007显示2007年的日历表date041217002007.00设置日期和时间-月日时分年.秒clock-w将时间修改保存到BIOS   关机(系统的关机、重启以及登出)shutdown-hnow关闭系统(1)init0关闭系统(2)telinit0关闭系统(

  • windows 同时安装python2和python3并配置虚拟环境

       一、Python3 与python2环境搭建  1、首先去官网下载对应版本的python解释器,这里建议python2下载2.7 python3下载3.6    首先是因为python2.7是很经典的2版本,3版本的要选择3.7一下的,因为后续使用django框架的话,django1.1版本和django2.X的版本就好比python2和python3的区别,    我们要使用django的话必须要python3.7以下的才能支持django1.11   2、下载:https://www.python.org/downloads/windows/     二、修改python安装包对应的启动配置 1、下载完成后,为了区别python2与python3的版本,修改如下2个文件名,python3同理         注意:  python3版本需要特别注意:将安装目录下的更改后的python3.exe和pythonw3.exe复制到任意一目录下,然后更名

  • 约瑟夫环经典问题

    publicstaticvoidmain(String[]args){ System.out.println(JSON.toJSON(kingRing(41,3))); } //链表实现-删除效率高-不需要复制或移动元素 publicstaticInteger[]kingRing(intcount,intkill){ Integer[]array=newInteger[Math.min(count,kill-1)]; intindex=0; if(count<kill){ //自增妙用 for(inti=0;i<count;i++){ array[index++]=index; } } List<Integer>link=newLinkedList(); for(intj=0;j<count;j++){ link.add(j+1); } intnumber=0; intpointer=0; while(kill<=link.size()){ number++; if(pointer>link.size()-1){ pointer=0; } i

  • 25个有用的 Python 代码段

    Python是一种通用的高级编程语言。用它可以做许多事,比如开发桌面GUI应用程序、网站和Web应用程序等。 作为一种高级编程语言,Python还可以让你通过处理常见的编程任务来专注应用程序的核心功能。并且,编程语言的简单语法规则进一步简化了代码库的可读性和应用程序的可维护性。 与其他编程语言相比,Python的优势在于: 与主要平台和操作系统兼容; 有许多开源框架和工具; 代码具备可读性和可维护性; 健壮的标准库; 标准测试驱动开发 在本文中,我将介绍25个简短且有用的代码段,它们可以帮你完成日常任务。 1 在两个变量之间交换值 在其他语言中,要在两个变量间交换值而不是用第三个变量,我们要么使用算术运算符,要么使用位异或(BitwiseXOR)。在Python中,它就简单多了,如下所示。 a=5 b=10 a,b=b,a print(a)#10 print(b)#5 2 检查给定的数字是否为偶数 如果给定的数字为偶数,则如下函数返回Ture,否则返回False。 defis_even(num): returnnum%2==0 is_even(10)#True 3 将多行字符串拆分为

  • 假期学习进度6

    假期学习进度6

  • 评 |「影」

    虚虚实实,真真假假。 张艺谋挑选的颜色:黑,灰,白,红。在一种极致声响下,血从体管内喷涌而出,或许只有红才是真。 水墨武侠,听起来便中国风。评论呈现两极分化,借鉴提炼出核心词:唯美与空洞。画面大气,特点突出(每一帧都能作为壁纸);内容虚浮,剧情普通。 是好是坏,都是哈姆雷特。就我个人而言,它作为商业片,卖点即为画面,但事实情况是,很多观众吃剧情故事。而故事剧情在电影里没有突出且有些生搬硬套和巧合——很多角色的死亡原因都是奇奇怪怪模模糊糊;但作为文艺片,《影》做到了极致。在中国似乎只有动画片能够到达这种意境。 在影片中,时间感和地点感都很弱,强大的是人性。张艺谋放弃了剧情的正常转换,选择了节奏。以“琴”、“萧”、“瑟”作为战场的背景音,两处地点的重合感使得“谋”字得到全方面的书写。 角色,不提流量小生,邓超、孙俪等人演技达到顶峰。邓超成为《白夜追凶》后又一成功塑造两位角色的演员。细看下去,子虞与境州在某些时刻的眼神出奇的相似,在某些时刻出奇的背离,最后几刀的张力和子虞死前的眼神很成功。小艾在子虞和境州之前徘徊纠结,渴望某种回归却迟迟得不到证明。两次发现人性背后的黑影时,绝望的眼神得到完美

  • 对Joint Training of Cascaded CNN for Face Detection一文的几点疑惑

    最近读了JointTrainingofCascadedCNNforFaceDetection这篇论文,论文中把之前人脸检测使用到的cascadecnn,从分开训练的模式,改为了联合训练,并且声称得到了更好的结果。 但是在我读论文的过程中,产生了下面几点疑惑: 1.论文4.2节的Trainingprocedure这部分最后提到,Tomakeitconvergeeasily,wetrainseperatenetworksandinitializethejointnetworkwithtrainedweights.说明联合网络利用了分别训练的模型作为初始权重。这相当于把之前的cascadecnn又训练了一遍,然后再初始化jointnetwork,训练步骤其实比之前的cascadecnn更复杂了,而且在分别训练各个网络时,采用了怎样的配置参数,以及训练的目标,均未提及。 2.论文6.3节中提及该方法在FDDB上测试结果,在falsepositives=1000时recall是88.2%,而之前的cascadecnn是85.7%。但是我在FDDB网站上查阅到的CascadeCNN的结果是,fal

  • C++中将int转变成string和string转变成int

    inttostring #include<iostream> #include<string> usingnamespacestd; intmain() { strings; charc[100]; intm=199; itoa(m,c,10); s=c; s.insert(0,"zhang"); cout<<s<<endl; return0; }复制 stringtoint #include<iostream> #include<string> usingnamespacestd; intmain() { strings="56sd"; inta=atoi(s.c_str()); cout<<a<<endl; return0; }复制     另外一种方法,包含#include<sstream>,例如 #include<iostream> #include<sstream> #include<string>

相关推荐

推荐阅读