0

80 万行を超えるテーブルの読み取りに問題があります。行を処理するには、行を上から下に読み取る必要があります。

そのために Scala と Phantom を使用します。

これが私のテーブルの外観です。

CREATE TABLE raw (
    id uuid PRIMARY KEY,
    b1 text,
    b2 timestamp,
    b3 text,
    b4 text,
    b5 text
) WITH bloom_filter_fp_chance = 0.01
    AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}'
    AND comment = ''
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'}
    AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    AND gc_grace_seconds = 864000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99.0PERCENTILE';

これまでのところ、次を使用してテーブルを読み取ろうとしました。

def getAllRecords : Future[Seq[row]] = select.fetch

または、より派手な Play Enumerator を Iteratee と組み合わせます

def getAllRecords : Enumerator = select.fetchEnumrator

カサンドラ/ドライバー/私のプログラムは常にすべてのレコードを事前に読み取ろうとするようですが、ここで何が欠けていますか?

4

1 に答える 1

1

より大きな読み取りテストでコードを確認してみましたか?

class IterateeBigReadPerformanceTest extends BigTest with ScalaFutures {

  it should "read the correct number of records found in the table" in {
    val counter: AtomicLong = new AtomicLong(0)
    val result = TestDatabase.primitivesJoda.select
      .fetchEnumerator run Iteratee.forEach {
      r => counter.incrementAndGet()
    }

    result.successful {
      query => {
        info(s"done, reading: ${counter.get}")
        counter.get() shouldEqual 2000000
      }
    }
  }
}

これは、事前に記録を読み取るものではありません。実際、十分な GC 一時停止、GC オーバーヘッドがないこと、permgen/metaspace 圧力が範囲内にあることなどを保証するために、1 時間以上実行するテストがあります。

実際に何かが変更された場合、それはエラーになっているだけですが、これはまだ機能するはずです。

于 2016-03-09T23:35:10.150 に答える