【发布时间】:2014-03-18 01:12:15
【问题描述】:
以下语句如何在处理大量行(例如 5 亿行)时帮助提高程序效率。
随机分区器:
get_range()
有序分区器:
get_range(start='rowkey1',finish='rowkey10000')
还有,在将get_range 用于列族超过一百万行的有序分区器时,一次可以处理多少行。
谢谢
【问题讨论】:
标签: python cassandra pycassa cassandra-2.0
以下语句如何在处理大量行(例如 5 亿行)时帮助提高程序效率。
随机分区器:
get_range()
有序分区器:
get_range(start='rowkey1',finish='rowkey10000')
还有,在将get_range 用于列族超过一百万行的有序分区器时,一次可以处理多少行。
谢谢
【问题讨论】:
标签: python cassandra pycassa cassandra-2.0
还有,当使用 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()。
【讨论】:
编辑:Tyler Hobbs 在他的评论中指出,这个答案不适用于 pycassa 驱动程序。显然它已经处理了我在下面提到的所有内容。
===========
如果您的问题是您是否可以使用 get_range() 一次选择所有 500M 行,那么答案是“否”,因为 Cassandra 在尝试回答您的请求时会耗尽内存。
如果您的问题是在使用随机分区器的情况下是否可以一次以 N 行的批次查询 Cassandra 的所有行,那么答案是“是”。使用顺序保留分区器的不同之处在于您不知道下一批的第一个键是什么,因此您必须使用当前批次的最后一个键作为起始键,并在迭代新的行时忽略该行批。对于第一批,只需使用“空”键作为键范围限制。此外,没有办法通过查看返回的键来说明相对而言您已经走了多远,因为没有保留顺序。
至于行数:从小处开始。说 10,然后尝试 100,然后 1000。根据您正在查看的列数、索引大小、可用堆等,您将看到单个查询超过特定阈值时性能明显下降。
【讨论】:
get_range() 方法时,您的观点都是正确的,但 pycassa 的 get_range() 处理所有这些观点。默认情况下,它透明地将查询分成 1024 行的块。这可以使用 buffer_size 参数进行更改。它还正确地推进每个子查询的 start_key,无论分区器如何。