我有一个字符串迭代器,其中每个字符串可以是"H"(header) 或"D"(detail)。我想将此迭代器拆分为多个块,其中每个块以一个标题开头,并且可以有 0 到多个细节。
我知道如何解决这个问题,将所有内容加载到内存中。例如,下面的代码:
Seq("H","D","D","D","H","D","H","H","D","D","H","D").toIterator
.foldLeft(List[List[String]]())((acc, x) => x match {
case "H" => List(x) :: acc
case "D" => (x :: acc.head) :: acc.tail })
.map(_.reverse)
.reverse
Run Code Online (Sandbox Code Playgroud)
返回 5 个块 - List(List(H, D, D, D), List(H, D), List(H), List(H, D, D), List(H, D))- 这就是我想要的。
但是,不是List[List[String]]在结果中,我想要一个Iterator[List[String]]或其他一些结构,它允许我懒惰地评估结果并且如果整个迭代器被消耗,则不将整个输入加载到内存中,我只想将被消耗的块加载到内存中一次(例如:当我打电话时iterator.next)。
如何修改上面的代码来达到我想要的结果?
编辑:我在 Scala 2.11 中特别需要这个,因为我使用的环境坚持它。很高兴也接受其他版本的答案。
我正在使用Cassandra 2.0和python CQL.
我创建了一个列系列如下:
CREATE KEYSPACE IF NOT EXISTS Identification
WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy',
'DC1' : 1 };
USE Identification;
CREATE TABLE IF NOT EXISTS entitylookup (
name varchar,
value varchar,
entity_id uuid,
PRIMARY KEY ((name, value), entity_id))
WITH
caching=all
;
Run Code Online (Sandbox Code Playgroud)
然后,我尝试计算此CF中的记录数,如下所示:
#!/usr/bin/env python
import argparse
import sys
import traceback
from cassandra import ConsistencyLevel
from cassandra.cluster import Cluster
from cassandra.query import SimpleStatement
def count(host, cf):
keyspace = "identification"
cluster = Cluster([host], port=9042, control_connection_timeout=600000000)
session = cluster.connect(keyspace)
session.default_timeout=600000000 …Run Code Online (Sandbox Code Playgroud) 我使用的是astyanax连接池,定义如下:
ipSeeds = "LOAD_BALANCER_HOST:9160";
conPool.setSeeds(ipSeeds)
.setDiscoveryType(NodeDiscoveryType.TOKEN_AWARE)
.setConnectionPoolType(ConnectionPoolType.TOKEN_AWARE);
Run Code Online (Sandbox Code Playgroud)
但是,我的群集有4个节点,我有8个客户端机器连接在它上面.LOAD_BALANCER_HOST将请求转发给我的四个节点之一.
在客户端节点上,我有:
$netstat -an | grep 9160 | awk '{print $5}' | sort |uniq -c
235 node1:9160
680 node2:9160
4 node3:9160
4 node4:9160
Run Code Online (Sandbox Code Playgroud)
因此,虽然ConnectionPoolType是TOKEN_AWARE,我的客户端似乎主要连接到node2,有时连接到node1,但几乎从不连接到节点3和4.
问题是:为什么会发生这种情况?难道令牌识别连接池不应该查询节点列表的环并使用循环算法连接到所有活动节点吗?