2011-04-27 2 views
1

Casbah (또는 mongodb의 java 드라이버)는 많은 수의 반환 된 객체를 처리하는 데 문제가있는 것 같습니다. 예를 들어, 다음 코드 세그먼트는 IllegalArgumentException을 생성하고 단일 결과 (아래의 전체 스택 추적)를 반환하지 않습니다. 그러나 "한계 (...)"를 1994로 줄이면 모든 것이 잘 작동하는 것 같습니다.많은 수의 반환 된 객체가있는 Casbah의 문제

for (link <- links; query = link $exists true) { 
    val group = new HashMap[String, Set[(String, String)]] with MultiMap[String, (String, String)] 
    log.find(query, fieldsToGet.result).limit(1996) foreach { 

     x => { 
     group.addBinding(x.get(link).toString, (x.get("_id").toString(), x.get("eventType").toString)) 
     } 

    } 
    allGroups += link -> group 
    } 

Apr 26, 2011 8:23:40 PM com.mongodb.DBTCPConnector$MyPort error 
SEVERE: MyPort.error called 
java.lang.IllegalArgumentException: response too long: 1278031173 
    at com.mongodb.Response.<init>(Response.java:40) 
    at com.mongodb.DBPort.go(DBPort.java:101) 
    at com.mongodb.DBPort.go(DBPort.java:66) 
    at com.mongodb.DBPort.call(DBPort.java:56) 
    at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:211) 
    at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:266) 
    at com.mongodb.DBCursor._check(DBCursor.java:309) 
    at com.mongodb.DBCursor._hasNext(DBCursor.java:431) 
    at com.mongodb.DBCursor.hasNext(DBCursor.java:456) 
    at com.mongodb.casbah.MongoCursorBase$class.hasNext(MongoCursor.scala:72) 
    at com.mongodb.casbah.MongoCursor.hasNext(MongoCursor.scala:517) 
    at scala.collection.Iterator$class.foreach(Iterator.scala:631) 
    at com.mongodb.casbah.MongoCursor.foreach(MongoCursor.scala:517) 
    at Sequencer$$anonfun$3.apply(Sequencer.scala:23) 
    at Sequencer$$anonfun$3.apply(Sequencer.scala:20) 
    at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:61) 
    at scala.collection.immutable.List.foreach(List.scala:45) 
    at Sequencer$.<init>(Sequencer.scala:20) 
    at Sequencer$.<clinit>(Sequencer.scala) 
    at Sequencer.main(Sequencer.scala) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:115) 
Exception in thread "main" java.lang.ExceptionInInitializerError 
    at Sequencer.main(Sequencer.scala) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:115) 
Caused by: java.lang.IllegalArgumentException: response too long: 1278031173 
    at com.mongodb.Response.<init>(Response.java:40) 
    at com.mongodb.DBPort.go(DBPort.java:101) 
    at com.mongodb.DBPort.go(DBPort.java:66) 
    at com.mongodb.DBPort.call(DBPort.java:56) 
    at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:211) 
    at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:266) 
    at com.mongodb.DBCursor._check(DBCursor.java:309) 
    at com.mongodb.DBCursor._hasNext(DBCursor.java:431) 
    at com.mongodb.DBCursor.hasNext(DBCursor.java:456) 
    at com.mongodb.casbah.MongoCursorBase$class.hasNext(MongoCursor.scala:72) 
    at com.mongodb.casbah.MongoCursor.hasNext(MongoCursor.scala:517) 
    at scala.collection.Iterator$class.foreach(Iterator.scala:631) 
    at com.mongodb.casbah.MongoCursor.foreach(MongoCursor.scala:517) 
    at Sequencer$$anonfun$3.apply(Sequencer.scala:23) 
    at Sequencer$$anonfun$3.apply(Sequencer.scala:20) 
    at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:61) 
    at scala.collection.immutable.List.foreach(List.scala:45) 
    at Sequencer$.<init>(Sequencer.scala:20) 
    at Sequencer$.<clinit>(Sequencer.scala) 
    ... 6 more 

java 드라이버의 "Response.java"에서 다음 검사를 통해 예외가 생성 된 것으로 보입니다.

ByteArrayInputStream bin = new ByteArrayInputStream(b); 
_len = Bits.readInt(bin); 
if (_len > (32 * 1024 * 1024)) 
throw new IllegalArgumentException("response too long: " + _len); 

해당 특정 개체가 반환 될 수 있습니까? 아니면 이것이 카스바에 관한 것일 수 있습니까? 자바 드라이버는 전류 응답 블록보다 큰 32 메가 있는지 확인하고 예외를 발생처럼

덕분 데릭

+0

이것은 자바 드라이버 수준입니다. 나는 그것을 들여다 볼 것이다. –

+0

mongodb 및 Casbah의 어떤 버전입니까? –

+0

mongodb 1.8.1을 사용하고 있습니다. casbah의 경우 라이브러리 버전은 2.8.1-2.0.2입니다. – defoo

답변

3

그것은 보인다.

커서에서 batchSize (FEWER_NUMBER_OF_DOCS)를 설정하면 데이터베이스의 잠금 시간이 줄어들고 32MB 미만의 데이터가 반환됩니다.

응용 프로그램에 가장 적합한 것이 무엇인지보기 위해 batchSize를 가지고 놀았습니다.

http://api.mongodb.org/scala/casbah/2.1.2/scaladoc/

최대

아마 자바 드라이버 증가한다.

응답에 대한 이상한 부분은 ~ 1.19GB 상당의 데이터를 반환한다는 것입니다.

응답에 많은 양의 데이터가없는 경우 수집이 손상되었음을 나타낼 수 있습니다.