2

現在、Linuxで次のようなプログラムをデバッグしています。

int main(){
    loadHugeFile();
    processTheDataOfTheFile();
    return 0;
}

重要なのはloadHugeFile、関数がギガバイト単位で非常に大きなファイルをロードする必要があることです。これには約5分かかりますがprocessTheDataOfTheFile、必要なデータを計算していくつかの値を返すのに10秒もかかりません。将来的には、ファイルのサイズがさらに大きくなる可能性があり、ロードにさらに時間がかかります。ファイルは反転インデックスであるため、ファイル全体が必要です。

1つのプロセスにこのファイルをRAMにロードさせ、それを保持させ、他のプロセスにロードされたファイルのこの部分にアクセスさせることは可能ですか?これは、その分数の読み込みをスキップするためです。Windowsには、別のプロセスのメモリにアクセス/変更できるこの機能があることを思い出しますが、ここでLinuxで利用できる選択肢は何ですか?

4

4 に答える 4

3

mmap機能を使用できます。

コンピューティングでは、mmap(2)は、ファイルまたはデバイスをメモリにマップするPOSIX準拠のUnixシステムコールです。これは、メモリマップトファイルI/Oの方法です。

2つの利点があります。Extreme speedファイルのロード時に、コンテンツは他の多くのプロセス間で共有できるメモリ領域にあります(mmapフラグとともに使用するだけMAP_SHAREDです)。

この短くて汚いコードでmmapの速度をテストできます。コンパイルして実行し、パラメータとしてロードするファイルを渡します。

#include <stdio.h>
#include <stdint.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>

int main(int argc, char *argv[])
{
    struct stat sb;

    int fd = open(argv[1], O_RDONLY);

    // get the size in bytes of the file
    fstat (fd, &sb);

    // map the file in a memory area
    char *p = mmap (0, sb.st_size, PROT_READ, MAP_SHARED, fd, 0);

    // print 3 char of the file to demostrate it is loaded ;)
    printf("first 3 chars of the file: %c %c %c\n", p[0], p[1], p[2]);

    close(fd);

    // detach
    munmap(p, sb.st_size);
}
于 2013-02-13T15:58:21.207 に答える
2

これを行うには複数の方法がありますが、直接的な方法は、ファイルをmmapし、他のプロセス間で共有メモリを使用して、ファイルにアクセスできるようにすることです。

また、ファイル自体の周りに高レベルのソケット読み取り/書き込みAPIを実装し、ユーザーがAPIを介してファイルにアクセスできるようにすることもできます。 ただし、ファイルをSQLデータベースなどにロードして、可能であれば実際のデータベースバックエンドを使用できるようにすることを検討してください。これらはこのタイプのもの用に設計されているためです。

また、ファイルへの変更を検出する必要がある場合は、inotify/dnotifyを使用できます

于 2013-02-13T15:58:18.293 に答える
1

ファイルが数ギガバイトの場合、RAMがオーバーフローし、RAMからのデータがハードドライブのスワップセクションにプッシュされるため、ロードに非常に時間がかかると思います。

ファイルを一度読み取ってRAMに保持するという目的を達成する方法のひとつは、ファイルを/dev/shm/ディレクトリにコピーすることです。のファイル/dev/shm/は実際にはRAMに保存され、複数のプロセスで使用できます。ただし、ファイルがシステム上のRAMの量よりもかなり多い場合でも、ハードドライブへのスワップと同じ問題が発生するため、お勧めしません。

mmapでメモリマップトファイルを使用することをお勧めします。これにはいくつかの利点があります。

  • このファイルは、RAM内のデータの配列のように見え、アドレス指定されます。
  • 現在読み取られているファイルの一部のみがRAMにロードされます。
  • OSは、RAMからのデータの取り込みとディスクへのプッシュバックを処理するため、セットアップ後は非常に簡単に使用できます。

もう1つのオプションは、処理機能を更新してストリーミングモードで動作するようにすることです。これは、可能な場合とできない場合があります。

于 2013-02-13T16:00:21.533 に答える
1

既成概念にとらわれずに、データベースを使ってみませんか?データベースは大きなファイルを検索するために最適化されており、キャッシュのおかげで、パフォーマンスを向上させるためにそのファイルの一部をメモリに保持します。複数のプロセスが同時にファイルにアクセスできます。

于 2013-02-13T16:05:52.467 に答える