0

特定の長さに基づいてランダムな文字列を生成しようとしています。たとえば、長さが4の場合、aaaaからzzzzまでのすべての文字列を生成します。後でテストするために、すべての繰り返しが必要です。これは私がそれについて行っている方法です:

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

問題は、大量のメモリを消費することです。実際、私のプログラムは、rubyインタプリタが十分なメモリを割り当てることができないために終了します。これらの文字列を生成するためのメモリをあまり消費しない方法はありますか?

編集:レンは技術的には変数です。範囲は2〜7です。

4

4 に答える 4

3

を使用するだけ('aaaaa'..'zzzzz').to_aです。これにより、各数値を4文字の配列として作成し、それらを文字列に結合するという中間ステップが回避されます。

これは(私のシステムでは)約4倍高速であり、ほぼ確実にメモリの一部を使用します。

...問題は、lenが2から7までの変数であるということです。

次に、を使用します(('a' * len)..('z' * len)).to_a'a' * len一時的な割り当ては、4〜14文字で生成された文字列のみであるため、これはさらに高速'z' * lenです。

于 2013-03-13T13:28:54.940 に答える
0

順列を1つずつステップスルーできます。後でそれらをまとめて処理する必要があるかどうかによって異なります。

したがって、文字列を1つずつテストにフィードできる場合は、次のことができます。

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

と 。。。

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

それでもまだ処理が必要ですが、このようなコードの実行には少なくとも数分かかると思います。1100万を超える個別の文字列をテストしています。

于 2013-03-13T13:30:17.963 に答える
0
len = 5
(('a'*len)..('z'*len)).to_a
于 2013-03-13T18:43:34.953 に答える
0

使用されるメモリの量を減らすことは、フライウェイトパターンを使用することで達成できます。

ソリューションにどれだけの時間を投資しようとしているのかわかりませんがx、特定の順序で多数の「文字」が含まれ、各文字がStringsの共有プール(各文字に1つ)を指すクラスを作成します。アルファベットで)あなたはあなたの記憶を下げることを可能にするでしょう(あなたはこれにハッシュを使うことができます)。次に、をオーバーライドしてto_s、新しいオブジェクトを出力したり、新しいオブジェクトrepeated_permutationを受け入れるようにメソッドを変更したりできます。

lenあなたがかなり大きくなることを期待している場合にのみ、解決策はあなたの時間の価値があることに注意してください。

于 2013-03-13T13:37:26.950 に答える