天道酬勤,学无止境

识别时间序列数据中的高计数时期(Identify periods of high counts in timeseries data)

问题

使用示例数据框:

count.bouts <-structure(list(time.stamp = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 
                                    7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 
                                    20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 28L, 29L, 30L, 31L, 
                                    32L, 33L, 34L, 35L, 36L, 37L), .Label = c("13:00:00", "13:00:10", 
                                                                              "13:00:20", "13:00:30", "13:00:40", "13:00:50", "13:01:00", "13:01:10", 
                                                                              "13:01:20", "13:01:30", "13:01:40", "13:01:50", "13:02:00", "13:02:10", 
                                                                              "13:02:20", "13:02:30", "13:02:40", "13:02:50", "13:03:00", "13:03:10", 
                                                                              "13:03:20", "13:03:30", "13:03:40", "13:03:50", "13:04:00", "13:04:10", 
                                                                              "13:04:20", "13:04:30", "13:04:40", "13:04:50", "13:05:00", "13:05:10", 
                                                                              "13:05:20", "13:05:30", "13:05:40", "13:05:50", "13:06:00"), class = "factor"), 
           count = c(5L, 11L, 16L, 19L, 15L, 11L, 8L, 5L, 2L, 6L, 12L, 
                     15L, 20L, 12L, 6L, 2L, 18L, 25L, 26L, 15L, 13L, 6L, 5L, 4L, 
                     8L, 9L, 16L, 26L, 29L, 55L, 21L, 6L, 9L, 28L, 16L, 19L, 26L, 
                     5L)), .Names = c("time.stamp", "count"), class = "data.frame", row.names = c(NA, 
                                                                                                  -38L))

我希望创建一个函数来识别满足以下标准的高计数活动:

  1. 对大于等于 10 的数据进行 1 分钟或更长时间的计数
  2. 在这段(或回合)高计数期间,我将允许计数数据在最多 20 秒内(在回合内)降至 10 以下

满足此标准的数据我希望通过向数据框中添加一个额外的列(称为“1min+.bouts”)来突出显示。 然后每个回合都将用一个从 1 开始的数字来标识 - 即上述数据帧对于第一回合(13:01:40 到 13:03:20)会有一系列 1,然后对于第二回合(13 :04:20 到 13:05:50)。 0 将被添加到那些没有回合的行中。

我希望这是有道理的。 如果有人可以指出我正确的方向。 可以帮助我的软件包或功能,我应该非常感激。

回答1

这假设没有 NA 值:

#which counts are >= 10
tmp <- count.bouts$count >= 10
#substitute FALSE with NA, so we can use na.approx for interpolation
tmp[!tmp] <- NA
library(zoo)
#fill gaps of up to two values
tmp <- na.approx(tmp, method = "constant", maxgap = 2, na.rm = FALSE)
#NA --> 0
tmp[is.na(tmp)] <- 0
#run lengths
tmp <- rle(tmp)
#we don't want run lengths shorter one minute
tmp$values[tmp$lengths < 6] <- 0
#number the run lengths we are interested in  
tmp$values <- cumsum(tmp$values) * tmp$values
#inverse run length encoding
count.bouts$bout <- inverse.rle(tmp)
#   time.stamp count bout
#1    13:00:00     5    0
#2    13:00:10    11    0
#3    13:00:20    16    0
#4    13:00:30    19    0
#5    13:00:40    15    0
#6    13:00:50    11    0
#7    13:01:00     8    0
#8    13:01:10     5    0
#9    13:01:20     2    0
#10   13:01:30     6    0
#11   13:01:40    12    1
#12   13:01:50    15    1
#13   13:02:00    20    1
#14   13:02:10    12    1
#15   13:02:20     6    1
#16   13:02:30     2    1
#17   13:02:40    18    1
#18   13:02:50    25    1
#19   13:03:00    26    1
#20   13:03:10    15    1
#21   13:03:20    13    1
#22   13:03:30     6    0
#23   13:03:40     5    0
#24   13:03:50     4    0
#25   13:04:00     8    0
#26   13:04:10     9    0
#27   13:04:20    16    2
#28   13:04:30    26    2
#29   13:04:30    29    2
#30   13:04:40    55    2
#31   13:04:50    21    2
#32   13:05:00     6    2
#33   13:05:10     9    2
#34   13:05:20    28    2
#35   13:05:30    16    2
#36   13:05:40    19    2
#37   13:05:50    26    2
#38   13:06:00     5    0
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Resolution of std::chrono::high_resolution_clock doesn't correspond to measurements(Resolution of std::chrono::high_resolution_clock doesn't correspond to measurements)
    问题 让我通过这个测试程序问我的问题: #include <iostream> #include <chrono> using std::chrono::nanoseconds; using std::chrono::duration_cast; int main(int argc, char* argv[]) { std::cout << "Resolution (nano) = " << (double) std::chrono::high_resolution_clock::period::num / std::chrono::high_resolution_clock::period::den * 1000 * 1000 * 1000 << std::endl; auto t1 = std::chrono::high_resolution_clock::now(); std::cout << "How many nanoseconds does std::cout take?" << std::endl; auto t2 = std::chrono::high_resolution_clock::now(); auto diff = t2-t1; nanoseconds ns = duration_cast<nanoseconds>(diff); std::cout <<
  • MySQL - 按日期时间段的峰值访问计数(MySQL - Peak visit counts by datetime period)
    问题 我有一个访问表(id int、开始日期时间、结束日期时间),我希望跟踪访问高峰次数。 示例数据: +------+---------------------+---------------------+ | id | date-time-1 | date-time-2 | +------+---------------------+---------------------+ | 1059 | 2016-07-04 19:13:00 | 2016-07-04 19:20:05 | | 1060 | 2016-07-04 19:13:30 | 2016-07-04 19:14:25 | | 1061 | 2016-07-04 19:14:39 | 2016-07-04 19:20:05 | | 1062 | 2016-07-05 02:34:40 | 2016-07-05 02:45:23 | | 1063 | 2016-07-05 02:34:49 | 2016-07-05 02:45:34 | +------+---------------------+---------------------+ 预期的结果应该是: +-------------------------------------------+-------+ | date-time-1 | date-time
  • 基于树莓派(Raspberry Pi3)平台通过微信(WeChat模块)进行交互的智能家居实现(一)
    前言:    其实做这个智能家居系统我还是因为学校的毕业设计,距离上篇文章发布已经过去了20多天了,之前想着只是做一个烟雾报警,然后通过Zabbix进行报警,但是通过这20多天的设计,我发现实现报警的功能其实除了邮件,还有短信、微信、甚至电话。但是因为各种原因,比如.....钱0.0,哈哈哈,因此我计划用企业微信进行一个报警,然后貌似通过普通微信进行一个简单的交互(interactive),还是不错的选择,并且做出来的效果也很棒。  最后想说的是,下面文章如果有不正确的地方,还请多指正。  一、实现内容(重要)    前面我已经做了阐述,要做智能家居控制系统,除了实现各种报警之外,还要做到和Raspberry的交互,通过手机来控制它的输出,和执行相应的动作,还有最重要的一点,后面会用到运动识别检测。。。噢耶:)  1.实现目标   下面是实现的具体目标,分三部分:交互端,报警端,摄像头运动物体检测报警端。 普通微信端交互控制: 通过“MQ-2烟雾报警模块”实现对家中的气体检测。 通过“DHT11温度检测模块”实现对家中的温度测控。 通过“继电器模块”实现对家中电器设备的开闭控制。 随时查看摄像头所拍摄的照片  企业微信端的报警: 当家中温度出现异常,进行报警。 当家中有害气体含量异常,进行报警。 当家中有继电器控制的电器设备异常开启或者关闭,进行报警。  家中运动物体识别检测报警:
  • 如何使用 TSQL 识别记录中的记录模式序列?(How do you identify record pattern sequences in records using TSQL?)
    问题 这对我来说是一个相当新的练习,但我需要找到一种方法来识别表格中的模式序列。 例如,假设我有一个类似于以下内容的简单表格: 现在我想做的是识别和分组所有具有值 5、9 和 6 的序列模式的记录,这些记录在查询中呈现它们。 您将如何使用 T-SQL 完成此任务? 结果应如下所示: 我已经寻找了一些可能的例子来说明如何实现这一点,但找不到任何真正有帮助的东西。 回答1 您可以使用包含在CTE中的以下查询来为序列中包含的值分配序列号: ;WITH Seq AS ( SELECT v, ROW_NUMBER() OVER(ORDER BY k) AS rn FROM (VALUES(1, 5), (2, 9), (3, 6)) x(k,v) ) 输出: v rn ------- 5 1 9 2 6 3 使用上面的CTE您可以识别孤岛,即包含整个序列的连续行的切片: ;WITH Seq AS ( SELECT v, ROW_NUMBER() OVER(ORDER BY k) AS rn FROM (VALUES(1, 5), (2, 9), (3, 6)) x(k,v) ), Grp AS ( SELECT [Key], [Value], ROW_NUMBER() OVER (ORDER BY [Key]) - rn AS grp FROM mytable AS m LEFT JOIN
  • 如何动态识别数据文件中的未知分隔符?(How do you dynamically identify unknown delimiters in a data file?)
    问题 我有三个输入数据文件。 每个都为其中包含的数据使用不同的分隔符。 数据文件一看起来像这样: apples | bananas | oranges | grapes 数据文件二如下所示: quarter, dime, nickel, penny 数据文件三看起来像这样: horse cow pig chicken goat (列数的变化也是有意为之) 我的想法是计算非字母字符的数量,并假设最高计数是分隔符。 但是,带有非空格分隔符的文件在分隔符前后也有空格,因此空格在所有三个文件中都占优势。 这是我的代码: def count_chars(s): valid_seps=[' ','|',',',';','\t'] cnt = {} for c in s: if c in valid_seps: cnt[c] = cnt.get(c,0) + 1 return cnt infile = 'pipe.txt' #or 'comma.txt' or 'space.txt' records = open(infile,'r').read() print count_chars(records) 它将打印一个包含所有可接受字符计数的字典。 在每种情况下,空格总是获胜,所以我不能依靠它来告诉我分隔符是什么。 但我想不出更好的方法来做到这一点。 有什么建议么? 回答1 如果您使用的是
  • C ++ 11如何打印出高分辨率时钟time_point(C++11 how to print out high resolution clock time_point)
    问题 从high_resolution_clock获得time_point时,如何打印time_point? timestamp = std::chrono::high_resolution_clock::now(); std::time_t now = std::chrono::system_clock::to_time_t(timestamp); std::cout << std::ctime(&now) << std::endl; 编译时收到以下错误消息: error: no viable conversion from 'time_point<class std::__1::chrono::steady_clock, duration<[...], ratio<[...], 1000000000>>>' to 'const time_point<class std::__1::chrono::system_clock, duration<[...], ratio<[...], 1000000>>>' time_t tt = std::chrono::system_clock::to_time_t(timestamp); 回答1 没有真正优雅的方法可以做到这一点。 high_resolution_clock未知与UTC或任何其他日历有关。
  • java应用程序中的高CPU利用率 - 为什么?(High CPU Utilization in java application - why?)
    问题 我有一个 Java 应用程序(基于 Web),它有时会在几个小时内显示出非常高的 CPU 利用率(几乎 90%)。 Linux TOP命令显示了这一点。 在应用程序重新启动时,问题就消失了。 所以要调查: 我使用线程转储来查找线程在做什么。 几个线程处于'RUNNABLE'状态,一些处于其他几个状态。 在进行重复的线程转储时,我确实看到了一些始终处于'RUNNABLE'状态的线程。 因此,他们似乎是罪魁祸首。 但我无法确定哪个线程正在占用 CPU 或进入无限循环(从而导致 CPU 利用率过高)。 日志不一定有帮助,因为违规代码可能没有记录任何内容。 我如何调查 - 应用程序的哪个部分或哪个线程导致 CPU 利用率高? - 还有其他想法吗? 回答1 如果分析器不适用于您的设置,您可以尝试按照本文中的步骤确定线程。 基本上,分为三个步骤: 运行top -H并获取 CPU 最高的线程的 PID。 将PID转换为十六进制。 在您的线程转储中查找具有匹配 HEX PID 的线程。 回答2 您可能是垃圾收集问题的受害者。 当您的应用程序需要内存并且它配置为使用的内存越来越低时,垃圾收集器将经常运行,这会消耗大量 CPU 周期。 如果它无法收集任何东西,您的内存将保持低位,因此它将一次又一次地运行。 当您重新部署您的应用程序时,内存会被清除,垃圾收集不会超过需要的次数,因此 CPU
  • 给定不同大象的寿命,找出大象最多存活的时期(Given the life time of different elephants, find the period when maximum number of elephants lived)
    问题 我遇到了一个面试问题: “给定不同大象的生命时间。找出最大数量的大象活着的时期。” 例如: 输入: [5, 10] , [6, 15] , [2, 7] 输出: [6,7] (3 头大象) 我想知道这个问题是否与“n”个字符串的最长子字符串问题有关,这样每个字符串代表一个时间段的连续范围。 例如: [5,10] <=> 5 6 7 8 9 10 如果没有,有什么可以很好地解决这个问题? 我想用 C++ 编写它。 任何帮助将不胜感激。 回答1 对于每头大象,创建两个事件:大象出生,大象死亡。 按日期对事件进行排序。 现在遍历这些事件,并不断计算还活着的大象数量; 每次达到新的最大值时,记录开始日期,每次从最大值下降时,记录结束日期。 此解决方案不依赖于整数日期。 回答2 如果我是你在面试时,我会创建一个std::array与大象的最大age ,然后为每头大象增加元素数,如: [5,10] << 5 to 10数组中从索引5 to 10所有元素递增。 然后我会排序并找到最大的数字在哪里。 有可能使用std::map类的map<int,int> ( 1st - period, 2nd - number of大象)。 它将默认排序。 我想知道您是否知道更好的解决方案? 回答3 这类似于检查括号是否丢失的程序。 它还与日期范围重叠有关。 这个主题在 StackOverflow
  • 分库分表中间件的高可用实践
    分库分表中间件的高可用实践前言分库分表中间件在我们一年多的锤炼下,基本解决了可用性和高性能的问题(只能说基本,肯定还有隐藏的坑要填),问题自然而然的就聚焦于高可用。本文就阐述了我们在这方面做出的一些工作。哪些高可用的问题作为一个无状态的中间件,高可用问题并没有那么困难。但是尽量减少不可用期间的流量损失,还是需要一定的工作的。这些流量损失主要分布在:(1)某台中间件所在的物理机突然宕机。 (2)中间件的升级和发布。由于我们的中间件是作为数据库的代理提供给应用的,即应用把我们的中间件当做数据库,如下图所示: 所以出现上述问题后,业务上很难通过重试等操作去屏蔽这些影响。这就势必需要我们在底层做一些操作,能够自动的感知中间件的状态从而有效避免流量的损失。中间件所在物理机宕机的情况物理机宕机其实是一种常见现象,这时候应用一瞬间就没了响应。那么跑在上面的sql肯定也是失败了的(准确来说是未知状态,除非重新查询后端数据库,应用无法得知准确的状态)。这部分流量我们肯定是无法挽救。我们所做的是在client端(Druid数据源)能够快速的发现并剔除宕机的中间件节点。发现并剔除不可用节点通过心跳去发现不可用节点自然而然的我们通过心跳来探查后端中间件的存活状态。我们通过定时创建一个新连接ping(mysql的ping)一下然后立马关闭来做心跳(这种做法便于我们区分正常流量和心跳流量
  • 识别列表列表中的重复项并总结它们的最后一项(Identify duplicates in a list of lists and sum up their last items)
    问题 我有一个列表列表,我想从中删除重复项并总结重复项的最后一个元素。 如果项目的前 2 个元素相同,则该项目是重复的。 用一个例子可以更好地说明这一点: input = [['a', 'b', 2], ['a', 'c', 1], ['a', 'b', 1]] # Desired output output = [['a', 'b', 3], ['a', 'c', 1]] 这里有类似的问题,但我还没有找到一个可以同时处理列表列表和总结列表项的问题。 我尝试了几种方法,但无法使其工作: 创建输入列表的副本,进行嵌套循环,如果找到第二个重复项,则将其最后一项添加到原始项 --> 嵌套太多,这太混乱了我查看了集合计数器,但它似乎不适用于列表列表迭代工具 你能给我一些关于如何解决这个问题的建议吗? 回答1 我不认为列表是最好的数据结构。 我会使用带有元组键的字典。 我确实需要列表,您可以稍后创建一个: from collections import defaultdict data = [['a', 'b', 2], ['a', 'c', 1], ['a', 'b', 1]] result = collections.defaultdict(int) # new keys are auto-added and initialized as 0 for item in data: a, b
  • 如何使用Kibana + Elastic Search检索字段的唯一计数(How to retrieve unique count of a field using Kibana + Elastic Search)
    问题 是否可以使用Kibana查询字段的唯一/唯一计数? 我将弹性搜索用作Kibana的后端。 如果是这样,查询的语法是什么? 这是指向我要查询的Kibana界面的链接:http://demo.kibana.org/#/dashboard 我正在用logstash解析nginx访问日志,并将数据存储到弹性搜索中。 然后,我使用Kibana来运行查询并使图表中的数据可视化。 具体来说,我想知道使用Kibana在特定时间范围内唯一IP地址的数量。 回答1 对于Kibana 4,请转到此答案 使用术语面板很容易做到这一点: 如果要选择日志中不同IP的计数,则应在clientip字段中指定,您应输入足够长的数字(否则,它将在同一组中加入不同的IP)并在样式表。 添加面板后,您将获得一个包含IP的表格以及该IP的数量: 回答2 现在,Kibana 4允许您使用聚合。 除了构建像在此答案中为Kibana 3所解释的那样的面板外,现在我们还可以看到不同时期内唯一IP的数量,这是OP最初想要的(IMO)。 要构建这样的仪表板,您应该转到“可视化”->“选择索引”->“选择垂直条形图”,然后在“可视化”面板中: 在Y轴上,我们想要IP的唯一计数(选择存储IP的字段),在X轴上,我们想要带有时间域的日期直方图。 按下“应用”按钮后,我们应该有一个图表,显示按时分配的IP的唯一计数。
  • 计算 30 天 bin 中的行数(Count the number of rows in 30 day bins)
    问题 我的表中的每一行都有一个日期时间戳,我希望从现在开始查询数据库,计算过去 30 天、之前 30 天等等的行数。 直到有一个 30 天的 bin 回到表的开头。 我通过使用 Python 并进行了几次查询,成功地执行了此查询。 但我几乎可以肯定,它可以在一个 MySQL 查询中完成。 回答1 没有存储过程、临时表、只有一个查询,以及给定日期列索引的高效执行计划: select subdate( '2012-12-31', floor(dateDiff('2012-12-31', dateStampColumn) / 30) * 30 + 30 - 1 ) as "period starting", subdate( '2012-12-31', floor(dateDiff('2012-12-31', dateStampColumn) / 30) * 30 ) as "period ending", count(*) from YOURTABLE group by floor(dateDiff('2012-12-31', dateStampColumn) / 30); 除了这个咒语之外,这里发生的事情应该很明显: floor(dateDiff('2012-12-31', dateStampColumn) / 30) 该表达式出现了多次
  • .NET中的高分辨率计时器(High resolution timer in .NET)
    问题 我想对我的代码进行一些基本的分析,但是发现C#中的DateTime.Now仅具有大约16 ms的分辨率。 必须有更好的时间保存我尚未发现的构造。 回答1 这是计时操作的代码示例: Dim sw As New Stopwatch() sw.Start() //Insert Code To Time sw.Stop() Dim ms As Long = sw.ElapsedMilliseconds Console.WriteLine("Total Seconds Elapsed: " & ms / 1000) 编辑: 整洁的是它也可以恢复。 Stopwatch sw = new Stopwatch(); foreach(MyStuff stuff in _listOfMyStuff) { sw.Start(); stuff.DoCoolCalculation(); sw.Stop(); } Console.WriteLine("Total calculation time: {0}", sw.Elapsed); 如果您的系统上有一个System.Diagnostics.Stopwatch类,它将使用一个高分辨率计数器。 回答2 System.Diagnostics.StopWatch类非常适合分析。 如果您不想编写自己的测量功能,则这里是Vance Morrison的Code
  • iPhone 的高分辨率计时器?(High-resolution timer for iPhone?)
    问题 我正在寻找 iPhone 的高分辨率计时代码,以便进行一些性能计时。 我想写这样的代码: HighResolutionTimer* myTimer = [[HighResolutionTimer alloc]init]; [myTimer start]; [self doSomeLengthyOperation]; NSLog( @"doSomeLengthyOperation took %f seconds", [myTimer elapsedTime] ); 回答1 查看 mach/mach_time.h 标头中的 mach_absolute_time()。 不要使用 NSDate。 当 ntp 做它的事情时,甚至不能保证 NSDate 偶尔不会倒退。 (设备可能有时钟漂移。如果 iOS 设备快速漂移几秒钟,那么当 NTP 纠正此漂移时,您会看到时钟突然倒退几秒钟。非常不利于计时。mach_time 使用的计数器不会曾经被 NTP 纠正,因此不能倒退,因此在时间上要好得多。) 回答2 更好的选择是 CACurrentMediaTime(),它使用mach_absolute_time()但为您将其转换为 CFTimeInterval(即以秒为单位的时间)。 回答3 这是我对使用mach_absolute_time()和NSDate时钟计时器的答案,基于此处显示的计算方法。
  • STM32CubeMX学习笔记(13)——PWM输出(呼吸灯)使用
    一、PWM简介 **脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调试。**是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。广泛应用在从测量、通信到功率控制与变换的许多领域中。 例如上图中,图b)是微处理输出的数字信号,实际上他接到电机等功率设备上时,效果相当于图a)。这就是PWM调制。例如输出占空比为50%,频率为10Hz的脉冲,高电平为3.3V.则其输出的模拟效果相当于输出一个1.65V的高电平。脉冲调制有两个重要的参数,第一个就是输出频率,频率越高,则模拟的效果越好。第二个就是占空比。占空比就是改变输出模拟效果的电压大小。占空比越大则模拟出的电压越大。 二、定时器简介 STM32F1 系列中,除了互联型的产品,共有 8 个定时器,分为基本定时器,通用定时器和高级定时器。 基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时,没有外部 IO。 通用定时器 TIM2/3/4/5 是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,每个定时器有四个外部 IO。 高级定时器 TIM1/8 是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,还可以有三相电机互补输出信号,每个定时器有 8 个外部 IO。 STM32 的定时器除了
  • Yahoo Finance URL不起作用(Yahoo Finance URL not working)
    问题 我已经使用以下URL从Yahoo Finance提取历史数据已有一段时间了,但是从昨天起它就停止了工作。 https://ichart.finance.yahoo.com/table.csv?s=SPY 浏览到此站点时,它说: 马上就回来... 感谢您的耐心等待。 我们的工程师正在迅速解决该问题。 但是,由于从昨天开始仍然存在此问题,所以我开始认为他们已停止了此服务? 我的SO搜索仅将我指向该主题,尽管该主题与https有关... 还有其他人遇到此问题吗? 我该如何解决这个问题? 他们是否提供了不同的历史数据访问方式? 回答1 雅虎已经进入了Reactjs前端,这意味着如果您分析从客户端到后端的请求标头,则可以获取它们用于填充客户端存储的实际JSON。 主持人: query1.finance.yahoo.com HTTP / 1.0 query2.finance.yahoo.com HTTP / 1.1(HTTP / 1.0和HTTP / 1.1之间的差异) 如果您打算使用代理或持久连接,请使用query2.finance.yahoo.com 。 但是出于本文的目的,示例URL所使用的主机并不意味着暗示与它所使用的路径有关的任何内容。 基本数据 (将您的代码替换为:AAPL) /v10/finance/quoteSummary/AAPL?modules= ?modules
  • 如何使用 mysqli_multi_query 识别导致错误的查询?(How to identify the query that caused the error using mysqli_multi_query?)
    问题 使用 SO 上其他地方的示例来更好地捕获“隐藏”错误。 虽然下面的代码将捕获并返回错误,但是否可以改进它以报告发生错误的查询? 使用下面的代码,输出是: Columns: 18 Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FRO inventory' at line 1 正在测试的代码: $query = "SELECT * FROM orders WHERE location = 'IN' ORDER BY orderNum DESC LIMIT 20;"; $query .= "SELECT * FRO inventory"; // With error $ord = array(); $invent = array(); if(mysqli_multi_query($link, $query)) { do { // fetch results if($result = mysqli_store_result($link)) { echo 'Columns: ' . mysqli_field_count($link) . "<br>"
  • 从池中获取连接之前经过的超时时间(The timeout period elapsed prior to obtaining a connection from the pool)
    问题 我们的网站在一天中的90%时间内都可以正常运行,然后在高峰时段流量约为正常水平的两倍时,一切都会变慢。 通常为1秒的页面加载时间需要30秒。 检查我们的错误日志,看来这可能是连接池问题。 我们有3个Web服务器连接到1个sql服务器数据库。 SQL服务器在所有内核上的利用率都低于25%。 我查看了SQL Server上的“用户连接”计数器,发现在高峰期我们有400多个“用户连接”,但下班时间约为120多个。 我很确定我们将使用MS附带的任何默认设置来处理我们的应用程序池。 我该怎么做才能检查是否存在应用程序池问题? 将应用程序池大小增加到1000的负面影响(我该怎么做?)。 谢谢! 回答1 根据我的经验,您可以从SQL Server收到3种主要的超时类型: 1) InvalidOperationException客户端在命令字符串上指定的超时(默认15秒)之前无法从其自己的池中获得池化连接。 客户端的池已达到最大大小,并且所有池连接都已使用并且在超时之前一直处于使用状态。 2) SQLException连接超时。 客户端的连接池正在创建与数据库的新连接,但是在命令字符串中指定的超时(默认为15秒)之前,数据库不会响应。 3) SQLException命令超时。 已获得连接,但是SQL语句执行命令所花费的时间超过了命令的CommandTimeout属性上指定的超时(默认为30秒
  • MySQL:求和日期时间而不计算重叠时间两次(MySQL: sum datetimes without counting overlapping periods twice)
    问题 我需要根据如下表格计算花费的总时间: id | start_time | end_time | 期间可以重叠的地方。 我只需要计算 ovelpapping 周期一次。 例如,如果我有这样的时期: *----A----* *------C-----* *----------D----------* *-----B-----* *---E---* 总和将为: (A.end-A.start) + (C.end - B.start) + (D.end - D.start) 我对编写此查询时应该使用的方法有些困惑,如果您能提供帮助,我将不胜感激。 回答1 好的,我认真地坚持你在生产中使用它之前以各种方式测试它。 特别是测试如果在 1 个时间跨度内有 MULTIPLE 重叠会发生什么。 此查询的作用是计算每个时间跨度的持续时间,以及与具有更高 id 的其他时间跨度存在多少重叠。 select t1.id, t1.start_time, t1.end_time, t1.end_time - t1.start_time as duration, sum( if(t2.start_time < t1.start_time and t2.end_time > t1.end_time , t1.end_time - t1.start_time, 0) -- t2 completely around
  • 请识别这个算法:probabilistic top-k elements in a data stream(Please identify this algorithm: probabilistic top-k elements in a data stream)
    问题 我记得几年前听说过以下算法,但在网上找不到任何参考。 它仅使用计数器识别元素的数据流中的前元素(或重击者)。 这对于在使用最少内存的情况下查找热门搜索词、网络滥用者等特别有用。 算法:对于每个元素, 如果该元素还没有计数器并且 counters < ,则为该元素创建一个计数器并初始化为 1。 否则,如果元素确实有计数器,则增加它。 否则,如果元素没有计数器并且 counters > ,则减少现有计数器 。 如果达到 0,则用当前元素替换其对应的元素。 ( 是现有计数器列表的索引,其中对于到达此步骤的每个元素以循环方式增加。) 我发现了许多其他类似的算法(在这篇关于流算法的维基百科文章中列出了其中许多,尽管没有描述),但不是这个。 我特别喜欢它,因为它的实现和描述一样简单。 但是我想更多地了解它的概率特征——如果我只对前 100 个项目感兴趣,那么使用 1,000 个计数器而不是 100 个计数器有什么影响? 回答1 您正在谈论著名的 Misra-Gries 算法,而 Space-Saving Algorithm 是 Misra-Gries 算法的更快版本。 请查看此讲义以了解详细信息流算法达特茅斯第 1.2 节。 我想指出的一件事是,如果您只使用 k 个计数器,则该算法不会为您提供前 k 个元素,而是提供所有频率 > m / k 的元素,其中 m 是数据流的总长º