経由で HDF5 にアクセスするpandas
と、31 個を超える選択条件を作成できないという文書化されたバグに直面することがあります。これを回避するために、選択条件を分割し、反復子のバッチを作成して、最後に結果を連結することにしました。
これが私のアプローチです:
generators = []
for idChunk in grouper(conditionList, args.chunksizeGrouper, None):
# creates chunks of length args.chunksizeGrouper, will add [None] to fill up shorter lists
where = 'myId in [{}]'.format(
', '.join([str(id) for id in idChunk if id is not None]))
iteratorGenerator = lambda: hdfStore.select(
'table',
where=where,
iterator=True,
chunksize=args.chunksize
)
generators.append(iteratorGenerator)
#finally
doSomethingWithGeneraetors(generators, df, args)
つまり、ジェネレーターのリストを作成したいのです。呼び出すgenerator()
と、where 条件に対応する select ステートメントが返されます。
次に、これらすべてをリストに保存します。
完全を期すために、以下に `grouper() を示します。
def grouper(iterable, n, fillvalue=None):
'''
takes an iterable and returns chunks.
'''
args = [iter(iterable)] * n
return zip_longest(*args, fillvalue=fillvalue)
発生する問題の 1 つは、 の定義がwhere
ラムダ関数をさかのぼって書き直すことです。2 番目のラウンドにいるとき、新しく定義されwhere
た (2 番目の に基づく) は、内部にあるジェネレーターをidCunk
置き換えます。lambda
generators[0]
この問題を回避するにはどうすればよいですか? この構造で他に注意する必要があることはありますか、またはこれを処理するより良い方法はありますか?