次のコードスニペットがあります
def send(self, queue, fd):
for line in fd:
data = line.strip()
if data:
queue.write(json.loads(data))
もちろんどちらでも問題なく動作しますが、空白以外の行にのみ作用する構造を作成するための「より良い」方法があるのではないかと思うことがあります。
課題は、これが「fd」読み取りの反復的な性質を使用し、100MB以上の範囲のファイルを処理できるようにする必要があることです。
更新-この質問のポイントを急いで取得するために、メモリ使用量であるインポート部分を無視しています。たとえば、次の式です。
non_blank_lines = (line.strip() for line in fd if line.strip())
strip()アクションを2回実行することは言うまでもなく、ファイル全体をメモリにバッファリングします。これは小さなファイルでは機能しますが、100 MB以上のデータがある場合(または100 GB以上の場合)は失敗します。
挑戦の一部は次の作品ですが、読むべきスープです:
for line in ifilter(lambda l: l, imap(lambda l: l.strip(), fd)):
queue.write(json.loads(line))
魔法の人を探してください!
最終更新:PEP-289は、イテレータを使用した場合の[]と()の違いを理解するのに非常に役立ちます。