随机和有序分区器中的get_range

时间:2014-02-18 10:37:24

标签: python cassandra pycassa cassandra-2.0

以下语句如何帮助提高程序效率,同时处理大量行数,即5亿行。

随机分区:

get_range()

Ordered Partitioner:

get_range(start='rowkey1',finish='rowkey10000')

同时使用get_range处理行列数超过一百万的有序分区器时,可以一次处理多少行。

由于

2 个答案:

答案 0 :(得分:1)

编辑:Tyler Hobbs在评论中指出这个答案不适用于pycassa驱动程序。显然它已经照顾了我在下面提到的所有内容。

==========

如果你的问题是你是否可以使用get_range()一次选择所有500M行,那么答案是“否”,因为Cassandra会因为内存不足而试图回答你的请求。

如果您的问题是,如果随机分区程序正在使用中,您是否可以一次查询Cassandra中所有行的N行,则答案为“是”。使用订单保留分区程序的不同之处在于您不知道下一批的第一个键是什么,因此您必须使用当前批次的最后一个键作为起始键,并在迭代新的时忽略该行批量。对于第一批,只需使用“空”键作为键范围限制。此外,由于订单未被保留,因此无法通过查看返回的密钥来确定相对来说有多远。

至于行数:从小开始。比如10,然后尝试100,然后是1000.根据您正在查看的列数,索引大小,可用堆等,您将看到超过特定阈值的单个查询的性能明显下降。

答案 1 :(得分:1)

  

对于行列数超过一百万的有序分区程序,使用get_range时,一次可以处理多少行。

pycassa的get_range()方法适用于任意数量的行,因为它会自动将查询分解为更小的块。但是,您的应用程序需要以正确的方式使用该方法。例如,如果您执行以下操作:

rows = list(cf.get_range())

您的python程序可能会耗尽内存。使用它的正确方法是:

for key, columns in cf.get_range():
    process_data(key, columns)

默认情况下,此方法一次只能拉入1024行。如果需要,您可以使用buffer_size参数将其降低到get_range()