0

以下语句如何在处理大量行(例如 5 亿行)时帮助提高程序效率。

随机分区器:

get_range()

有序分区:

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

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

谢谢

4

2 回答 2

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()

于 2014-02-19T01:14:24.607 回答
1

编辑:泰勒霍布斯在他的评论中指出,这个答案不适用于 pycassa 驱动程序。显然,它已经处理了我在下面提到的所有内容。

==========

如果您的问题是您是否可以使用 get_range() 一次选择所有 500M 行,那么答案是“否”,因为 Cassandra 在尝试回答您的请求时会耗尽内存。

如果您的问题是在使用随机分区器的情况下是否可以一次以 N 行的批次查询 Cassandra 的所有行,那么答案是“是”。使用顺序保留分区器的不同之处在于您不知道下一批的第一个键是什么,因此您必须使用当前批次的最后一个键作为起始键,并在迭代新的行时忽略该行批。对于第一批,只需使用“空”键作为键范围限制。此外,没有办法通过查看返回的键来说明相对而言您已经走了多远,因为没有保留顺序。

至于行数:从小开始。说 10,然后尝试 100,然后尝试 1000。根据您正在查看的列数、索引大小、可用堆等,您将看到单个查询超过某个阈值时会出现明显的性能下降。

于 2014-02-18T12:09:22.667 回答