メモリが制限された設計モード(5):データファイル


背景
データ量が大きすぎて、メインストレージが収容できない場合はどうすればいいですか?
プログラム自体がコンパクトであるにもかかわらず、BTクライアントなどの大量のデータを処理しなければならない場合があります.これは、プログラム自体がホストメモリに入ることができるにもかかわらず、データがメモリを消費しすぎることを意味します.
を選択します.
そのため、私たちは一度に一部のデータだけを処理しなければなりません.残りはセカンダリストレージデバイスに格納されます.
より深い検討
IOストリーム内の各データを読み出して処理し、処理済みのデータを1つ以上のファイルに順次アクセスまたはランダムアクセスすることができます.
このモードは複雑ではなく,適用シーンも非常に広いが,このモードの限界を明らかにしなければならない.
まず、データをバッチで処理すると、実装の局所的な複雑さが増加します.
次に、リンクプログラムなどのデータを処理するために追加の環境情報が必要です.
また、複数の小型データ項目の読み取りは、大型データ項目の読み取りよりも効率が低いことが多い.
最後に、ファイルから10000個の数値を読み込む必要があり、入力前に10000個の数値をソートする必要があるなど、データにいくつかの要求がある場合、このモードを使用すると、システムの複雑さが増加し、可用性が低下します.
インプリメンテーション
このモードを実現する方法は主に3つあります.
  • 増分処理;
  • サブファイル処理;
  • ランダムアクセス;
  • 1.インクリメンタル処理
    これは、IOストリームからファイル全体を順次読み込み、処理結果を別のファイルに順次書き込む最も簡単で最も一般的な方法です.一般に、この方法は、HTTPダウンロード、ユーザ入力の読み取りなど、入力も順番に行われるシーンに適用される.
    2.サブファイル処理
    ファイルを順番に処理しない場合は、データを複数のミニファイルに分割することもできます.この場合、生成された各小ファイルを処理するためのプログラムを個別に作成し、これらの小ファイルを大ファイルにマージする必要があります.
    しかしながら、データの分割はそれほど容易ではなく、多くの場合、分割の境界を記録するために追加の情報が必要である.
    3.ランダムアクセス
    もちろん、ファイルにランダムにアクセスすることもできます.たとえば、UNIXではlseek()関数を使用してファイル内をナビゲートできます.この方法を使用すると、UNIXのファイル記述子などのいくつかの情報を記録するために追加の環境情報も必要です.

    1.インクリメンタル処理
    以下にQTの一例を示す(コードの一部のみを切り取った)
    
    void HttpWindow::startRequest(QUrl url)
    {
        reply = qnam.get(QNetworkRequest(url));
        connect(reply, SIGNAL(finished()),
                this, SLOT(httpFinished()));
        //       ,            readyRead  ,  httpReadyRead 
        connect(reply, SIGNAL(readyRead()),
                this, SLOT(httpReadyRead()));
        connect(reply, SIGNAL(downloadProgress(qint64,qint64)),
                this, SLOT(updateDataReadProgress(qint64,qint64)));
    }

    次に、プライベートスロットhttpReadyReadをどのように実現するかを見てみましょう.
    
    void HttpWindow::httpReadyRead()
    {
        //            ,       RAM   。
        if (file)
            file->write(reply->readAll());
    }

    2.サブファイル処理
    コンパイラはサブファイル処理の典型的な応用である.ユーザは大型プログラムを複数のファイルに分解し、コンパイラは1つずつ処理し、リンクはすべてを処理する.oファイルを実行可能プログラムにマージする:
    gcc -c foo1.c -o foo1.o
    gcc -c foo2.c -o foo2.o
    gcc foo1.o foo2.o -o foo

    3.ランダムアクセス
    UNIXファイルIOのいくつかの例を参照すればよい.余計なことは言わない.
    アタッチメント
    添付ファイルにはQTで実装された簡単なダウンロードプログラムがあります.例では、重要な部分の説明を抽出しました.
    予告
    次は、リソースファイルを紹介し、非常に広く応用されているモデルです.