当前位置: 首页 > 知识库问答 >
问题:

用容差匹配两个非常非常大的向量(速度快!但节省工作空间)

宋岳
2023-03-14
matches: abs(((referencelist - sample[i])/sample[i])*10^6)) < 0.5
referencelist <- read.table(header=TRUE, text="value  name
154.00312  A
154.07685  B
154.21452  C
154.49545  D
156.77310  E
156.83991  F
159.02992  G
159.65553  H
159.93843  I")

sample <- c(154.00315, 159.02991, 154.07688, 156.77312)
    name value      reference
1    A   154.00315  154.00312
2    G   159.02991  159.02992
3    B   154.07688  154.07685
4    E   156.77312  156.77310

我能做的是使用例如外部函数

myDist <- outer(referencelist, sample, FUN=function(x, y) abs(((x - y)/y)*10^6))
matches <- which(myDist < 0.5, arr.ind=TRUE)
data.frame(name = referencelist$name[matches[, 1]], value=sample[matches[, 2]])

或者我可以使用for()循环。

但我的特殊问题是,参考向量大约有1*10^12个条目,而我的样本向量大约有1*10^7个条目。因此,通过使用outer(),我可以轻松地破坏所有的工作空间限制,并且通过使用for()或链接的for()循环,这将需要几天/几周才能完成。

最美好的愿望

共有1个答案

何玺
2023-03-14

您的匹配条件

abs(((referencelist - sample[i])/sample[i])*10^6)) < 0.5

可以重写为

sample[i] * (1 - eps) < referencelist < sample[i] * (1 + eps)

EPS=0.5E-6

library(data.table)
options(digits = 10)
eps <- 0.5E-6 # tol * 1E6
setDT(referencelist)[.(value = sample, 
                       lower = sample * (1 - eps), 
                       upper = sample * (1 + eps)), 
                     on = .(ref > lower, ref < upper), .(name, value, reference = x.ref)]
   name     value reference
1:    A 154.00315 154.00312
2:    G 159.02991 159.02992
3:    B 154.07688 154.07685
4:    E 156.77312 156.77310
setDT(referencelist2)[.(value = sample, 
                       lower = sample * (1 - eps), 
                       upper = sample * (1 + eps)), 
                     on = .(ref > lower, ref < upper), .(name, value, reference = x.ref)]
   name     value reference
1:    A 154.00315 154.00312
2:    F 154.00315 154.00320
3:    G 159.02991 159.02992
4:    B 154.07688 154.07685
5:    E 156.77312 156.77310
 类似资料:
  • 问题内容: 我有一个MySQL查询(Ubu 10.04,Innodb,Core i7、16Gb RAM,SSD驱动器,优化的MySQL参数): 表em_link_data有大约700万行,em_link有数千行。此查询大约需要 18秒 才能完成。但是,如果我替换子查询的结果并执行以下操作: 那么查询将在不到1毫秒的时间内运行。仅子查询在不到1毫秒的时间内运行,因此索引了列linkid。 如果我将查

  • 我搜索了数据库和食谱,但似乎找不到正确的答案。我有一个非常简单的python代码,它总结了一个范围内的自我权力。我需要这个非常非常大的数字的最后十位,我已经尝试了get上下文(). prec,但是我仍然达到了极限。 代码如下: 我怎么能看到这些美丽的数字?它在我的四核上打印速度相对较快。这只是为了给ProjectEuler带来乐趣,问题#48,请不要破坏者。我不想要解决方案,也不想让工作为我完成,

  • 问题内容: 我正在查询有关的信息。 我正在迭代一个数组,并查询列表中的每个值。 不幸的是 ,在调试器下, 单个查询大约需要3-4秒,而 在禁用调试器的情况下, 查询时间要 短一些。 任何想法为什么这么慢?我使用进行测试。 这是我的代码: 更新资料 当我离开时,评估很快就完成了,但是我没有得到。它返回一个空字符串… 问题答案: 感谢@nvrmnd我尝试了一下,发现了一种更好的解析器: VTD-XML

  • 问题内容: 我面临一个非常奇怪的问题:使用Redis时,我的写入速度非常糟糕(在理想情况下,写入速度应该接近RAM上的写入速度)。 这是我的基准: 是生成随机字符串的类(arg是字符串长度) 以下是几个结果: [写入] nb:100000 |时间:4.408319378 |速度:0.713905907055318 MB / s [写入] nb:100000 |时间:4.4139469070553

  • 我有26个CSV文件,我想每晚从互联网上抓取并上传到Postgresql表中。我使用Java、PreparedStatement和Batch实现了这一点。尽管如此,性能仍然非常缓慢。要获取大约6000个条目并将其放入Postgresql,需要30分钟。这是我第一次做这样的事情,所以我不知道这是快还是慢。 为了获取文件,我使用了以下代码。 然后,我使用PreparedStatement从输入流中提取

  • 我使用的是Guidewire开发工作室(基于IntelliJ的IDE),在处理大文本文件(~1500行及以上)时速度非常慢。我也尝试了一个开箱即用的社区IntelliJ,但遇到了同样的问题。 当我打开这些文件时,键入一个字符需要 1 秒,即使我清楚地看到使用的内存仍然足够 (1441 MB/3959 MB)。此外,如果我打开多个文件,它会迅速吸收所有内存(我只为 IntelliJ 分配 4GB)。