2011-04-19 7 views
0

私が実行しているスクリプトでは、スクリプトが約325k回以上実行されるのを防ぐメモリリークの問題があります(プロプライエタリなソフトウェアが使用されているため)。それはそうのようなforループで反復処理するためにこの問題を回避するために、私は、値のリストを作成しました:増加する範囲のカウンタを作成するにはどうすればよいですか?

squery = 
['OBJECTID >=0 AND OBJECTID <=300000', 
'OBJECTID >=300001 AND OBJECTID <=600000', 
'OBJECTID >=600001 AND OBJECTID <=900000', 
.... 
'OBJECTID >=8700001 AND OBJECTID <=8766184'] 

for query in squery: 
    do work 

リストは、実行時に構築することができるように300K間隔でこれらの範囲を作成するための方法があります値がXに達するまで間隔を置いて?のように、900kのレコードに対して3つの間隔、150万のレコードに対して5つの間隔。

答えて

4
squery = 
['OBJECTID>=%s AND OBJECTID<=%s' % (i*300k+(i!=0),(i+1)*300k) for i in range(0,3)] 

は(300K = 300 000との間隔の数はrange(0,*3*)である)

+0

完璧、ありがとうございます。私はあなたがこのようにリストを作成できるかどうか分かりませんでした! – Nathanus

+0

それは 'list comprehensions'と呼ばれています:http://docs.python.org/tutorial/datastructures.html#list-comprehensions – manji

+0

私はそれらに精通しています。常にもっと学ぶべきことがあります。 – Nathanus

1

だけ完全を期すために、発電機はまたうまくこの問題を解決するであろう:

def generator_function(n): 
    for i in range(0,n): 
     yield ('OBJECTID>=%s AND OBJECTID<=%s' % (i*300000+(i!=0),(i+1)*300000)) 

# now use it: 
for each_string in generator_function(3): 
    print each_string 

この方法は、上の各文字列を生成しますそのため、状況によっては(たとえば、5つだけではなく膨大な数の文字列を生成したい場合など)、itertoolsはジェネレータの優れたコンパニオンです。

+0

代わりの方法をありがとう。 – Nathanus

関連する問題