3

Linux で単純な C プログラムを作成しており、ファイルからのデータを期待する既存のライブラリの API を使用したいと考えています。const char* としてファイル名を入力する必要があります。しかし、ファイルのコンテンツと同じように、ヒープに割り当てられたバッファーに既にデータがあります。十分な RAM があり、高性能が必要です。一時ファイルをディスクに書き込むのを避けたいのですが、ファイルのように見える方法でこの API にデータを供給する良い方法は何ですか?

これが私のコードの安価なふりバージョンです:

marvelouslibrary.h:

int marvelousfunction(const char *filename);

ライブラリが最初に設計された normal-persons-usage.cpp:

#include "marvelouslibrary.h"
int somefunction(char *somefilename)
{
    return marvelousfunction(somefilename);
}

myprogram.cpp:

#include "marvelouslibrary.h"
int one_of_my_routines() 
{
    byte* stuff = new byte[1000000];
    // fill stuff[] with...stuff!
    // stuff[] holds same bytes as might be found in a file

    /* magic goes here: make filename referring to stuff[] */

   return marvelousfunction( ??? );
}

明確にするために言うと、marvelouslibrary はポインターによってデータを受け入れる API 関数を提供していません。ファイルの読み取りのみが可能です。

パイプと mkfifo() を考えましたが、プロセス間の通信を目的としているようです。私はこれらのことについて専門家ではありません。名前付きパイプは、同じプロセスで読み取りと書き込みを行っても問題ありませんか? これは賢明なアプローチですか?

または、賢いことをスキップして、シャッドアップして一時ファイルを書き込むという計画「B」に進みます。しかし、新しいことを学び、この状況で何ができるかを知りたいと思っています。

4

5 に答える 5

3

次のような関数があると仮定します。

char *read_data(const char *fileName)

「賢いことをスキップして、シャッドアップするプラン「B」を使用して、一時ファイルを作成する」必要があると思います。

あなたが行っている呼び出しがファイル*またはファイル記述子のintをとる別の関数を呼び出しているかどうかを掘り下げて見つけることができれば、あなたはもっと良いことをすることができます。

頭に浮かぶ考えの1つは、ヒープではなくメモリマップトファイルに書き込むようにコードを変更できますか?そうすれば、すでにディスク上にファイルがあり、コピーを回避でき(ただし、ファイルはまだディスク上にあります)、関数呼び出しにファイル名を付けることができます。

于 2009-03-01T18:46:12.333 に答える
2

ライブラリ関数が必要とする入力の種類がわかりません...パス/ファイル名、またはオープンファイルポインター、またはオープンファイル記述子が必要ですか?

ライブラリをハッキングしたくなく、関数が文字列 (ファイルへのパス) を必要とする場合は、一時ファイルを /dev/shm に作成してみてください。

それ以外の場合は、mmap が最適なオプションである可能性があります。mmap() を使用する場合は posix_madvise() (一時ファイルを使用する場合は対応する posix_fadvise()) を調べてください。

そもそも非常に少ないデータについて話しているように見えるので、どのルートをたどってもパフォーマンスへの影響は見られないと思います.

編集

申し訳ありませんが、あなたの質問を読み直しました..おそらく私はあまりにも速く読んだだけです. 次のような関数をフィードする方法はありません。

char * foo(const char *filepath)

... mmap() で。

代わりに(またはパスの代替として)ファイル記述子を受け入れるようにライブラリを変更できない場合.. /dev/shmと一時ファイルを使用するだけで、かなり安価になります。

于 2009-03-01T06:41:28.160 に答える
0

編集:ごめんなさい。質問を読んでください。以下の私のアドバイスで、あなたは予備のプロセスをフォークします、そして「単一のプロセスで仕事をしているのか」という質問は出てきません。また、プッシュを実行するために別のスレッドを生成できなかった理由もわかりません...


少なくともエレガントではありませんが、次のことができます。

  1. 名前付きパイプを開きます。
  2. パイプに書き込もうとするだけのストリーマーをフォークする
  3. パイプの名前を渡します

これはかなり堅牢なはずです...

于 2009-03-01T20:06:06.183 に答える
0

Linuxを使用している場合、ライブラリのソースを取得して、必要な機能をハックすることはできませんか?他の人に役立つ場合は、元の作成者にパッチを送信することもできるので、将来のバージョンではすべての人に提供される予定です。

于 2009-03-01T20:08:30.000 に答える
-1

mmap()、おそらく?

于 2009-03-01T06:27:48.787 に答える