私はmysqlデータベースにアクセスする次の方法を持っており、メモリの増加に関して何も変更するアクセス権がないサーバーでクエリが実行されます。私はジェネレーターを初めて使用し、それについてもっと読み始め、これを変換してジェネレーターを使用できると考えました。
def getUNames(self):
globalUserQuery = ur'''SELECT gu_name FROM globaluser WHERE gu_locked = 0'''
global_user_list = []
try:
self.gdbCursor.execute(globalUserQuery)
rows = self.gdbCursor.fetchall()
for row in rows:
uName = unicode(row['gu_name'], 'utf-8')
global_user_list.append(uName)
return global_user_list
except Exception, e:
traceback.print_exc()
そして、このコードを次のように使用します。
for user_name in getUNames():
...
これは、サーバー側から取得していたエラーです。
^GOut of memory (Needed 725528 bytes)
Traceback (most recent call last):
...
packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
OperationalError: (2008, 'MySQL client ran out of memory')
これを回避するには、ジェネレーターをどのように使用すればよいですか。
while true:
self.gdbCursor.execute(globalUserQuery)
row = self.gdbCursor.fetchone()
if row is None: break
yield row
データベースメソッドの結果としてリストを期待しているので、上記が正しい方法であるかどうかはわかりません。クエリからチャンクを取得してリストを返すことは素晴らしいことだと思います。クエリが結果を返す限り、ジェネレーターは次のセットを取得します。