生成字符串并耗尽内存

时间:2013-03-13 13:18:00

标签: ruby arrays string performance permutation

我尝试根据一定的长度生成随机字符串。例如,如果length = 4,我生成从aaaa到zzzz的所有字符串。我稍后需要所有重复用于测试目的。这就是我要做的事情:

len = 5
str = ('a'..'z').to_a.repeated_permutation(len).map(&:join)

问题在于占用了大量内存。事实上,由于ruby解释器无法分配足够的内存,我的程序终止了。生成这些字符串的内存密集程度是否较少?

编辑:Len在技术上是一个变量。它的范围可以是2到7.

4 个答案:

答案 0 :(得分:3)

只需使用('aaaaa'..'zzzzz').to_a即可。它避免了将每个数字构建为四个字母数组并将它们连接成一个字符串的中间步骤。

这是(在我的系统上)大约四倍的速度,它几乎肯定会占用一小部分内存。

  

......问题是len是一个变量....从2到7

然后使用(('a' * len)..('z' * len)).to_a。这仍然更快,因为唯一的临时分配是由'a' * len'z' * len生成的字符串,其长度在4到14个字符之间。

答案 1 :(得分:0)

您可以逐个逐步进行排列 - 取决于您是否需要稍后批量处理它们。

因此,如果您可以逐个将字符串输入测试,那么您可以执行

enumerator = str = ('a'..'z').to_a.repeated_permutation(len)
my_test( enumerator )

并且。 。 。

def my_test e
  e.each do |string|
  # Test it
end

这仍然需要处理很多,我希望这些代码至少需要几分钟才能运行,你正在测试超过1100万个单独的字符串。

答案 2 :(得分:0)

使用flyweight模式可以降低使用的内存量。

我不确定你要花多少时间投资一个解决方案,但要创建一个在其中有x多个“字母”的类,这些字符按特定顺序排列,并且每个字母都指向一个共享String的池(字母表中的每个字母一个)将允许您降低内存(您可以使用哈希)。然后,您可以覆盖to_s以输出新对象,也可以修改repeated_permutation方法以接受新对象。

请注意,如果您希望len变得非常大,那么解决方案只值得花时间。

答案 3 :(得分:0)

len = 5
(('a'*len)..('z'*len)).to_a