首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Scala处理CQEngine ResultSet非常慢。

使用Scala处理CQEngine ResultSet非常慢。
EN

Stack Overflow用户
提问于 2013-12-19 06:49:49
回答 1查看 681关注 0票数 2

我试图使用Scala的foreach来处理CQEngine的ResultSet,但是结果非常慢。

下面是我想要做的事情的片段

代码语言:javascript
复制
import collection.JavaConversions._
val query = existIn(myOtherCollection, REFERENCE, REFERENCE)
val resultSet = myIndexCollection.retrieve(query)
resultSet.foreach(r =>{
    //do something here
})

不知何故,.foreach方法非常慢。我尝试通过放置SimonMonitor和使用while(resultSet.hasNext)更改.foreach进行调试,令人惊讶的是,对hasNext方法的每次调用大约需要1-2秒。太慢了。

我尝试使用Java创建相同的版本,Java版本非常快。

请帮帮忙

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-23 07:48:51

我无法用下面的测试代码重现您的问题。你能在你的系统上试用一下吗?让我知道它是如何运行的吗?

(取消注释第38行,garages.addIndex(HashIndex.onAttribute(Garage.BRANDS_SERVICED)),以使Scala和Java迭代器运行得非常快.)

输出第一(以毫秒为单位):

代码语言:javascript
复制
Done adding data
Done adding index
============== Scala ============== 
Car{carId=4, name='BMW M3', description='2013 model', features=[radio, convertible]}
Time : 3 seconds
Car{carId=1, name='Ford Focus', description='great condition, low mileage', features=[spare tyre, sunroof]}
Time : 1 seconds
Car{carId=2, name='Ford Taurus', description='dirty and unreliable, flat tyre', features=[spare tyre, radio]}
Time : 2 seconds
============== Java ============== 
Car{carId=4, name='BMW M3', description='2013 model', features=[radio, convertible]}
Time : 3 seconds
Car{carId=1, name='Ford Focus', description='great condition, low mileage', features=[spare tyre, sunroof]}
Time : 1 seconds
Car{carId=2, name='Ford Taurus', description='dirty and unreliable, flat tyre', features=[spare tyre, radio]}
Time : 2 seconds

代码如下:

代码语言:javascript
复制
import collection.JavaConversions._
import com.googlecode.cqengine.query.QueryFactory._
import com.googlecode.cqengine.CQEngine;
import com.googlecode.cqengine.index.hash._;
import com.googlecode.cqengine.IndexedCollection;
import com.googlecode.cqengine.query.Query;
import java.util.Arrays.asList;

object CQTest {

  def main(args: Array[String]) {

    val cars: IndexedCollection[Car] = CQEngine.newInstance();
    cars.add(new Car(1, "Ford Focus", "great condition, low mileage", asList("spare tyre", "sunroof")));
    cars.add(new Car(2, "Ford Taurus", "dirty and unreliable, flat tyre", asList("spare tyre", "radio")));
    cars.add(new Car(3, "Honda Civic", "has a flat tyre and high mileage", asList("radio")));
    cars.add(new Car(4, "BMW M3", "2013 model", asList("radio", "convertible")));

    // add cruft to try and slow down CQE
    for (i <- 1 to 10000) {
      cars.add(new Car(i, "BMW2014_" + i, "2014 model", asList("radio", "convertible")))
    }

    // Create an indexed collection of garages...
    val garages: IndexedCollection[Garage] = CQEngine.newInstance();
    garages.add(new Garage(1, "Joe's garage", "London", asList("Ford Focus", "Honda Civic")));
    garages.add(new Garage(2, "Jane's garage", "Dublin", asList("BMW M3")));
    garages.add(new Garage(3, "John's garage", "Dublin", asList("Ford Focus", "Ford Taurus")));
    garages.add(new Garage(4, "Jill's garage", "Dublin", asList("Ford Focus")));

    // add cruft to try and slow down CQE
    for (i <- 1 to 10000) {
      garages.add(new Garage(i, "Jill's garage", "Dublin", asList("DONT_MATCH_CARS_BMW2014_" + i)))
    }

    println("Done adding data")
    // cars.addIndex(HashIndex.onAttribute(Car.NAME));
    // garages.addIndex(HashIndex.onAttribute(Garage.BRANDS_SERVICED));
    println("Done adding index")
    val query = existsIn(garages, Car.NAME, Garage.BRANDS_SERVICED, equal(Garage.LOCATION, "Dublin"))
    val resultSet = cars.retrieve(query)

    var previous = System.currentTimeMillis()
    println("============== Scala ============== ")
    // Scala version
    resultSet.foreach(r => {
      println(r);
      val t = (System.currentTimeMillis() - previous)
      System.out.println("Time : " + t / 1000 + " seconds")
      previous = System.currentTimeMillis()
    })

    println("============== Java ============== ")
    previous = System.currentTimeMillis()
    // Java version
    val i: java.util.Iterator[Car] = resultSet.iterator()
    while (i.hasNext) {
      val r = i.next()
      println(r);
      val t = (System.currentTimeMillis() - previous)
      System.out.println("Time : " + t / 1000  + " seconds")
      previous = System.currentTimeMillis()
    }
  }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20675164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档