【发布时间】:2018-08-24 05:40:06
【问题描述】:
我想通过在两个不同的线程上运行此方法来减少 DatabaseUtil.precomputedKNNQuery 方法的运行时间,而 KNNQuery 是一个接口。
KNNQuery<O> knnq = DatabaseUtil.precomputedKNNQuery(database, relation, getDistanceFunction(), k);
我把这个LOF类的方法分成了这样两部分
Callable<KNNQuery> task1(Database database, Relation<O> relation){
DBIDs idss = relation.getDBIDs();
ArrayDBIDs aids = (ArrayDBIDs) idss;
aids = aids.slice(0, (aids.size() / 2));
aids.size();
ProxyView<O> pv = new ProxyView<>(aids, relation);
return () -> {
return DatabaseUtil.precomputedKNNQuery(database, pv,
getDistanceFunction(), k);
};
}
Callable<KNNQuery> task2(Database database, Relation<O> relation) {
DBIDs idss = relation.getDBIDs();
ArrayDBIDs aids = (ArrayDBIDs) idss;
aids = aids.slice(((aids.size() / 2) - 1), aids.size());
aids.size();
ProxyView<O> pv2 = new ProxyView<>(aids, relation);
return () -> {
return DatabaseUtil.precomputedKNNQuery(database, pv2, getDistanceFunction(), k);
};
}
然后我在 LOF 类的 run() 方法中像这样在两个不同的线程上调用了这两个任务
public OutlierResult run(Database database, Relation<O> relation) {
StepProgress stepprog = LOG.isVerbose() ? new StepProgress("LOF", 3) : null;
DBIDs ids = relation.getDBIDs();
LOG.beginStep(stepprog, 1, "Materializing nearest-neighbor sets.");
ExecutorService executor = Executors.newFixedThreadPool(2);
List<Callable<KNNQuery>> callables = Arrays.asList(
task1(database, relation),
task2(database, relation));
for (Future<KNNQuery> future : executor.invokeAll(callables)) {
KNNQuery<O> knnq = future.get();
// Compute LRDs
// compute LOF_SCORE of each db object
// Build result representation
}
}
但是我遇到了这样的异常,因为 forEach 只提供 knnq 变量中第一个未来的输出,而不是两个未来的组合输出。请帮助我如何摆脱这个例外,例如谢谢?
de.lmu.ifi.dbs.elki.datasource.FileBasedDatabaseConnection.load: 505 ms
LOF #1/3: Materializing nearest-neighbor sets.
de.lmu.ifi.dbs.elki.index.preprocessed.knn.MaterializeKNNPreprocessor.k: 4
de.lmu.ifi.dbs.elki.index.preprocessed.knn.MaterializeKNNPreprocessor.k: 4
Materializing k nearest neighbors (k=4): 21751 [100%] de.lmu.ifi.dbs.elki.index.preprocessed.knn.MaterializeKNNPreprocessor.precomputation-time: 21470 ms
Materializing k nearest neighbors (k=4): 21750 [100%]
de.lmu.ifi.dbs.elki.index.preprocessed.knn.MaterializeKNNPreprocessor.precomputation-time: 22355 ms
LOF #2/3: Computing Local Reachability Densities (LRD).
Task failed
de.lmu.ifi.dbs.elki.database.datastore.ObjectNotFoundException: Object
21751 was not found in the database.
at de.lmu.ifi.dbs.elki.database.datastore.memory.ArrayStore.get(ArrayStore.java:69)
at de.lmu.ifi.dbs.elki.index.preprocessed.knn.AbstractMaterializeKNNPreprocessor.get(AbstractMaterializeKNNPreprocessor.java:118)
at de.lmu.ifi.dbs.elki.database.query.knn.PreprocessorKNNQuery.getKNNForDBID(PreprocessorKNNQuery.java:84)
at de.lmu.ifi.dbs.elki.algorithm.outlier.lof.LOF.computeLRD(LOF.java:292)
at de.lmu.ifi.dbs.elki.algorithm.outlier.lof.LOF.computeLRDs(LOF.java:277)
at de.lmu.ifi.dbs.elki.algorithm.outlier.lof.LOF.run(LOF.java:244)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at de.lmu.ifi.dbs.elki.algorithm.AbstractAlgorithm.run(AbstractAlgorithm.java:89)
at de.lmu.ifi.dbs.elki.workflow.AlgorithmStep.runAlgorithms(AlgorithmStep.java:100)
at de.lmu.ifi.dbs.elki.KDDTask.run(KDDTask.java:109)
at de.lmu.ifi.dbs.elki.application.KDDCLIApplication.run(KDDCLIApplication.java:58)
at [...]
【问题讨论】:
-
你想做什么?您似乎要将数据集分成两部分,但这是为了什么?
-
我想通过在两个不同的线程上运行这个方法来减少这个方法的运行时间。现在我想我告诉了我这样做的原因,所以没有理由对我的问题投反对票
-
但是,如果将数据拆分为 A 和 B,是否会丢失一个点在 A 中而另一个点在 B 中的结果?
-
按原样,这个问题可能对其他人没有用处,但您除外 - 目前尚不清楚您要做什么以及为什么。也许如果你编辑它以更好地解释什么和为什么,那么它可能会变得有用。
-
你和 Elki 合作过吗?
标签: elki