我需要生成大量基本数据类型的数据,用于压力测试NoSQL数据库(Cassandra现在,未来可能还有其他数据库)。我还需要能够在将来重新创建这个随机创建的数据,更有问题的是,从这个已生成的数据中检索随机条目以生成查询。
通过向随机生成器提供相同的种子,重新创建数据本身不会产生任何问题。困难的部分是从生成的数据中检索随机项。好的方法是将所有数据存储在一个数据结构中,但我们正在谈论可能的GB数据,所以这不应该是一个选项(或者我错了吗?)。
先前生成的项目的随机重新生成也应该尽可能快,可以在不同的线程上同步,并且理想地提供一种方法来为生成的数据和测试数据项目的选择指定底层分布。
[edit] 我刚刚发现,random.jumpahead(n)
- 函数可能派上用场,唯一的问题是它不适用于自python以来使用的伪数生成器(PNGR) 2.3。但旧的仍然可用(random.WichmannHill()
),在那里我可以'#34;跳过'#34;从我最初的种子开始步骤。
而且要明确:我使用的是python 2.7。
[edit2] 这个问题可能归结为跳过 n 生成步骤。您可以使用原始PNGR执行此操作,其中包含一些代码,例如我找到的here:
def skip(n):
for _ in xrange(n):
random.random()
但是,正如在源中所说并经过我的测试,这仅对 n <~100000有效,这是小的方法。使用random.WichmannHill()
我可以将jumpahead(n)
用于任何具有相同性能的 n 。
答案 0 :(得分:1)
如果您已经知道1)您将生成的条目数,以及2)您需要从该数据中获取的随机条目数,您可以在生成它们时获取随机条目,仅存储在数据结构。
假设您需要为NoSQL数据库创建一百万个条目,并且您知道您将要从中获取100个随机项以测试查询。您可以生成1到1,000,000之间的100个随机数,并且当您为压力测试生成条目时,您可以获取与随机生成的数字匹配的条目,并将这些条目存储在数据结构中。或者,您可以将随机生成的条目保存到数据结构中,概率为m/n
,其中m
是您需要的随机测试查询数,n
是总量您正在创建的数据。
基本上,在生成随机数据时,比存储所有内容并从中随机抽取数据要容易得多。至于如何生成数据,这可能取决于你的NoSQL实现和你想要使用的特定数据格式。
编辑:正如dcorking指出的那样,您甚至不需要将测试项本身存储在数据结构中。您可以在生成数据时执行它们。您需要存储的只是确定运行哪些测试的序列。或者,如果您不希望每次都运行相同的测试,您可以随意选择某些元素作为您的测试元素,如上所述,并且根本不存储任何内容。