题记:

题外话:因为去年年底终于脱单了,所以停更了很久,(๑˙ー˙๑) ……

我上小学使用计算器时,很少使用M相关的按键(MU/MC/MR/M±),也分不清AC/CE/MC/C到底有啥区别,后来使用了科学计算器后,可以输入算式了,解决了标准计算器没有括号的问题。但是标准计算器(手机内置计算器一般是标准计算器)是非常常见的,当我计算圆相关的数据时,经常使用π的近似值,每次输入太麻烦,于是我就看了下计算器相关的说明,原来M就是memory,按键可以实现类似缓存的功能,这样我只要把3.14159265写入计算器缓存,就可以在清除缓存/关机前一直便捷地通过MR调用了。

大脑缓存:

我们先做一个心算题:7!等于多少?

你怎么算的?

你用了多久?

答案是5040。

我自己也计算了一下,我心里的计算过程大致是这样的:

1×2×3×4×5=(3×4)×(2×5)=12×10=120,

然后120×6=720,然后720×7=(700+20)×7=4900+140=5040;

从这个计算过程里面可以发现,我的大脑性能差不多是这样的:

"CPU"处理5以内的阶乘问题不大,计算两位数和一位数的乘法也可以,四位数相加也可以计算,但是内存比较小,每次内存只能存一个不大的数去参与下一次的计算;

但是,如果大脑没有缓存少量数的能力,我就无法计算稍微长一点的算式了。

可见,在大脑计算性能有限的前提下,“缓存”可以有效地提高计算能力。

模糊查询:

M的缓存和大脑缓存类似的地方在于,它快且效率高。

为了非常直观地让大家感受到缓存的威力,我们先做一个模糊查询的小练习:(诗词集)

这是一份300页的唐宋诗词文档,每一句诗词用Tab分隔,共13000行。

我这里给出了一个色彩表:

要求是:筛选出所有含有表示色彩字眼的诗句,并且标注出这些色彩字样。

(例如“万紫千红总是春”,标注:使用了“红”和“紫”两个表颜色的字)

使用M语言来解决这个练习题的最常规的思路是用笛卡尔积展开,然后对每一行使用Text.Contains来判断,最后筛选出true的行,但是这样做并不能直接得到结果,还需要对诗句做透视,将笛卡尔积展开的行给转化回去,因此不推荐这种解法。

常规解法:

首先将色彩表转化成单列(共57行),命名为“词根”:

然后使用从文本导入的方式,导入诗词数据:

先研究一下,单独一句诗词如何做判断?(请回忆前面讲解循环部分的学习笔记)

以“万紫千红总是春”为例:

=List.Accumulate(词根[色彩],"",(a,b)=>if Text.Contains("万紫千红总是春",b)=true then a&b else a)

M成功计算出,这句诗使用了“红紫”两个表颜色的字。

有了单独一句的核心判断函数,整个M语句就好写了,下面直接放代码:

let

添加列 = Table.AddColumn(诗词,"色彩",each List.Accumulate(词根[色彩],"",(a,b)=>if Text.Contains([诗词],b)=true then a&b else a)),

筛选 = Table.SelectRows(添加列, each ([色彩] <> ""))

in

筛选

来看看运行的结果:(这里不讨论筛选的结果是否在语义上是形容色彩的问题)

好,回到我们这篇文章的主题——缓存,上面的这个解法效率如何呢?

我的电脑是英特尔的NUC——骷髅峡谷,配置如下:4核8线程的6代标压i7,海盗船3000MHz的8GB内存双通道,三星SM961 256GB

上面的解法用这台电脑运算的时间如下:

考虑到我写文章时还开着浏览器,微信等其它软件,运算时间我就取三次计时的平均数作为时间上的一个参考值吧,嗯,常规解法用时为:9秒45。

缓存解法:

在M中有一个特殊的常见函数,在一般场合中用了和没用给人的感觉是一样的,没错,这个函数就是XXX.Buffer(缓存函数),例如:Table.Buffer和List.Buffer。

我们把上一个解法和我开始举的大脑运算例子做一下对比会发现,在不改变核心算法(类似于常规加减乘除运算)的前提下,影响解题速度的就是“缓存”能力,同样的道理,这个解法中,核心算法一直在做一件事情就是,不断地从硬盘上的“诗词”文本文件中一行一行地读取数据,大家都知道硬盘读取速度是很慢的(我的电脑硬盘是MLC的固态,速度很快了),这个步骤消耗了大量的时间!如果能够将诗词数据存入内存当中,那么利用内存读取速度快的优势将会大大缩短算法运行的时间!

好,大致原理清楚后,我们对常规解法的代码进行如下修改:

let

poem = Table.Buffer(诗词),

colors = List.Buffer(词根[色彩]),

添加列 = Table.AddColumn(poem,"色彩",each List.Accumulate(colors,"",(a,b)=>if Text.Contains([诗词],b)=true then a&b else a)),

筛选 = Table.SelectRows(添加列, each ([色彩] <> ""))

in

筛选

***接下来就是见证奇迹的时刻!!!

仅仅是加入了缓存函数,运算耗时极大地缩短到了不到1秒钟!!!

同样是80000个汉字,逐一检查56个颜色文字是否包含,一共做448万次Text.Contains的判断,两个算法耗时却产生了高达13倍左右的差距,因此善用Buffer函数,一定会给你的工作带来意想不到的效率提升!(特别是数据源是MySQL这样的数据库时)

ue模糊查询_Daizyue的Power Query学习笔记-缓存相关推荐

  1. Power BI学习笔记

    Power BI学习笔记 友好建议 1.excel文件.xls,.xlsx导入到Power BI经常会出现错误,建议保存和导入.csv格式表格 2.如果表格已经加载进来,对表格进行修改后,直接点击刷新 ...

  2. Microsoft Power BI 学习笔记

    ​   Power Bi 学习笔记 一   Power BI 是微软发布的一系列的软件服务.应用和连接器,这些软件服务.应用和连接器协同工作,将不相关的数据源转化为合乎逻辑.视觉上逼真的交互式见解. ...

  3. Power BI 学习笔记(一)

    一.power BI简介 PowerBI是微软新一代的交互式报表工具,把相关的静态数据转换为酷炫的可视化的,能够根据filter条件,对数据执行动态筛选,从不同的角度和粒度上分析数据. 三大特点 1. ...

  4. oracle查询当前归档scn_【学习笔记】Oracle数据库 查看归档日志存放的位置

    [学习笔记]Oracle数据库 查看归档日志存放的位置 时间:2016-10-21 19:19   来源:Oracle研究中心   作者:HTZ   点击: 次 天萃荷净 分享一篇关于查看Oracle ...

  5. bootstrap媒体查询类型的值_HTMLCSS学习笔记(二十一)-- 媒体查询 + rem用法

    媒体查询 + rem 计算方法 计算rem方法: 结合媒体查询 -> 随着设备的改变 更改html font-size的值. ​ 媒体查询确定范围?? ​ 移动端设计图 : 640px 750p ...

  6. 12 | 缓存:数据库成为瓶颈后,动态数据的查询要如何加速?-学习笔记

    通过前面数据库篇的学习,你已经了解了在高并发大流量下,数据库层的演进过程以及库表 设计上的考虑点.你的垂直电商系统在完成了对数据库的主从分离和分库分表之后,已经可 以支撑十几万 DAU 了,整体系统的 ...

  7. oracle查询数据做标记,【学习笔记】Oracle如何使用dbms_shared_pool.markhot标记热对象...

    [学习笔记]Oracle如何使用dbms_shared_pool.markhot标记热对象 时间:2016-10-30 20:17   来源:Oracle研究中心   作者:HTZ   点击: 次 天 ...

  8. oracle查询一列汇总,【学习笔记】Oracle数据筛选 查找oracle所有表中的特定列中的某些数据...

    天萃荷净 开发DBA反映,根据需求需要查找Oracle数据库中所有表中特定的列中指定的关键词的数据,和数据内容和数量 找出数据库中所有表表中REMARK列中含有WN.wind.wlr中表名和数量 de ...

  9. ue模糊查询_UE正则表达式语法

    % 匹配行首 - 表示搜索字符串必须在行首,但不包括任何选定的结果字符中的行终止字符. $ 匹配行尾 - 表示搜索字符串必须在行尾,但不包括任何选定的结果字符中的行终止字符. ? 匹配任何除换行符的字 ...

  10. 每日一学 | 2021-05-18 | Power BI 学习笔记00、01、02

    学习网址:孙兴华讲PowerBI火力全开版[本季完]PowerBI教程 Power BI教程 DAX语言 Access教程 Access数据库 Access_哔哩哔哩 (゜-゜)つロ 干杯~-bili ...

最新文章

  1. 使用云计算灾难恢复计划制定勒索软件恢复策略
  2. Installing python 2.7 on centos 6.3.
  3. 【C/C++】 读、写二进制文件经典实例
  4. Struts2框架执行流程
  5. 2小时彻底搞懂指针与共用体!
  6. Android拨打电话号功能
  7. [2021.1.31多校省选模拟12]随机变换的子串(线段树维护分治/字符串/自动机思想)
  8. 单硬盘上mac + win7双系统,GUID-GPT分区
  9. 用canvas给自己的博客园加背景(二)
  10. 神经网络Neural Net背景介绍
  11. 安全基础知识 最强0到33600端口详解
  12. Atom 备份神器 —— Sync Settings
  13. tf.nn.rnn_cell.DropoutWrapper用法细节案例2
  14. 教你如何拒绝带病毒的恶意网页陷阱
  15. 一文弄懂nginx反向代理和负载均衡
  16. 使用boost线程池很好的例子
  17. 【MapGIS精品教程】002:GDB本地数据库的使用
  18. H桥原理、驱动及应用
  19. 瑞云Rayvision渲染的原创动画《吃饭睡觉打豆豆》震撼来袭 ——创造产业历史,日点击量过200万次...
  20. 【Linux系统】第9节 linux系统中用户分类以及用户与组属性的修改示例

热门文章

  1. 暴躁算法(剑指系列)-每日一练
  2. heka study
  3. 力扣 2104. 子数组范围和
  4. HDU2881 Jack's struggle (LIS)
  5. 渗透测试常用工具-amap服务枚举
  6. android 闪屏 实现,Android游戏闪屏实现步骤详解
  7. 【概率论与数理统计(研究生课程)】知识点总结4(随机变量的数字特征)
  8. 计算机各类会议及投稿文章总结(快速入门)
  9. iOS 模拟器 获取位置 设置自定义位置
  10. jQuery fadeOut() 方法