一時ファイルを使用せずにzipストリームを生成する

Source python python-3.x stream compression zip

APIから大量のデータを収集し、CSVにフォーマットし、圧縮して結果をストリーミングする必要があるPythonメソッドがあります。

私はグーグルをしてきましたが、見つけることができるすべての解決策は、一時ファイルに書き込むか、アーカイブ全体をメモリに保持する必要があります。

私はOOMをかなり早く取得するので、メモリは絶対にオプションではありません。一時ファイルへの書き込みには、多くの問題があります(このボックスは、現時点ではログにディスクのみを使用し、ダウンロード開始までのリードタイムがはるかに長くなり、ファイルのクリーンアップの問題などが発生します)。それがただ厄介であるという事実は言うまでもありません。

私は私が次のようなことをすることを可能にするライブラリを探しています...
C = Compressor(outputstream)
C.BeginFile('Data.csv')
for D in Api.StreamResults():
    C.Write(D)
C.CloseFile()
C.Close()

つまり、にデータを書き込むときに出力ストリームを書き込むものです。

私は.NetとPHPでこれを行うことができましたが、Pythonでこれにアプローチする方法がわかりません。

物事を概観するために、「大量の」データとは、最大10 Gbの(生のプレーンテキスト)データを処理できる必要があることを意味します。これは、ビッグデータシステムのエクスポート/ダンププロセスの一部です。
推奨答え
gzip moduleのドキュメントに記載されているように、ファイルのようなオブジェクトをGzipFileコンストラクターに渡すことができます。
Pythonはダックタイプなので、次のように独自のストリームを自由に実装できます。
import sys
from gzip import GzipFile

class MyStream(object):
    def write(self, data):
        #write to your stream...
        sys.stdout.write(data) #stdout, for example

gz= GzipFile( fileobj=MyStream(), mode='w'  )
gz.write("something")
その他答え 1
@goncaploppの答え​​は素晴らしいですが、gzipを外部で実行すると、より多くの並列処理を実現できます。大量のデータを収集しているので、余分な努力をする価値があるかもしれません。 Windows用の独自の圧縮ルーチンを見つける必要があります(いくつかのgzip実装がありますが、7zのようなものでも機能する可能性があります)。システムで他に何を最適化する必要があるかに応じて、gzipよりも圧縮するlzのようなものを試すこともできます。
import subprocess as subp
import os

class GZipWriter(object):

    def __init__(self, filename):
        self.filename = filename
        self.fp = None

    def __enter__(self):
        self.fp = open(self.filename, 'wb')
        self.proc = subp.Popen(['gzip'], stdin=subp.PIPE, stdout=self.fp)
        return self

    def __exit__(self, type, value, traceback):
        self.close()
        if type:
            os.remove(self.filename)

    def close(self):
        if self.fp:
            self.fp.close()
            self.fp = None

    def write(self, data):
        self.proc.stdin.write(data)

with GZipWriter('sometempfile') as gz:
    for i in range(10):
        gz.write('a'*80+'\n')

関連記事

Xcode5でMogeneratorを機能させる手順
初めてKIVYを実行しようとしています
初めてKIVYを実行しようとしています
Django管理パネルにすべての外部キー関連オブジェクトを一覧表示するにはどうすればよいですか?
複数のサーバーでのFlaskログインはどのように機能しますか