0

解析したい

CLASSA classAvalue;
CLASSB classBvalue;
... ....
CLASSX classXvalue;

ファイルからのテキスト..

それらの順序は予測できません。

CLASSX classXvalue;
CLASSY classYvalue;
....   ......
CLASSA classAvalue;
CLASSB classBvalue;

名前 A、B、C....X のクラス / 構造があり、値をそれぞれの値にプッシュする必要があります。シンプルに保ちたいので、このテキストの解析に正規表現は使用しません。

RUNTIME は私にとって非常に重要です。解析するデータが 300MB を超えるファイルがあります。

文字列 strtok() をトークン化するというアイデアが浮かびました..しかし、tvalueをプッシュする前に、プッシュしているデータのタイプを比較する必要があります..これには時間がかかります..

関連するクラスにデータをプッシュする方法を最適化したい方法のいくつか.. ミリ秒も重要です..

これについてあなたの考えを共有してください、私は感謝します..

4

4 に答える 4

1

問題の説明には、さらに詳細が必要です。トークンを正規表現として表現できる場合(実際に RE を使用するとは言っていませんが、可能かどうか尋ねているだけです)、それらをスキャンする最も速い方法は、離散有限オートマトンを手作業でコーディングすることです。RE を指定していただければ、その方法をお見せします。

前述のように、ファイル システムを最適な方法で使用することは、優れたスキャン アルゴリズムと同じくらい重要です。あなたはあなたのOSを提供していないので、私たちはあなたを助けることができません. 多くの OS では、メモリ マッピング (Linux などmmap) が最速です。

于 2012-09-20T01:22:28.463 に答える
0

「値をそれぞれの値にプッシュする」には何が含まれますか? おそらく、それぞれのクラスまたはある種のアキュムレータ変数/関数を意味していましたか? 少なくとも 2 つの異なるクラスのデータが処理されている例を提供できれば、「最良の」回答を得るのに大いに役立ちます。

今のところ、データがあなたの質問に示されているとおりに表示されていると仮定します。テキスト ファイルでクラスを指定する方法に応じて、以下で使用される strcmp() を回避するために整数を使用するなど、値を switch() するためのより良い方法があります。

//疑似コード

while(not EOF)
  read a line from the file with fscanf or similar
  split sequence on first occurrence of a space
  switch() on the first segment which should be CLASS_
  call appropriate function to handle your data

//データの例: myclassA 12345 myclassB 67890 myclassC 19348

int data
char class_str[MAX_CHARS];

ret = fscanf(fp,"%s %i",class_str,&data);
while(ret != EOF){
    switch(class_str){

        case(strcmp(class_Str,"myclassA")==0):
            myclassA_data_processing_function();
            break;

        case(strcmp(class_Str,"myclassB")==0):
            myclassB_data_processing_function();
            break;
    }
}
于 2012-09-19T19:50:59.520 に答える
0

あなたのような単純なケースでは、多くの場合、IO パフォーマンスが CPU パフォーマンスよりも重要です。したがって、たとえば、バッファリングが正しく行われていることを確認する必要があります。

于 2012-09-20T00:33:36.797 に答える
0

1 ミリ秒が問題になる場合は、 Trie データ構造を実装して、型の一致を最速にします。タイプをすでに読んでいて、長さchar type[]を知っていると仮定します。type

switch (typeLength) {
case 3: // for cases where only one type aplies like e.g. Abc 
  if (0 == memcmp(type, "Abc", 3) { /*  read Abc object from stream */ }
  else ERROR;
  break;
case 5: // e.g. "Abcde", "Abcdf", "Ebcde"
  switch (type[0]) {
     case 'A': 
         // "A,,,"
         switch (type[1]) {
             case 'b':
...
                 switch (type[4]) {
                    case 'e': // read Abcde object
                    case 'f': // read Abcdf object
...     default: ERROR
     case 'E': // only Ebcde matches
         if (0 == memcmp(type + 1, "bcde") { /*  read Ebcde object from stream */ }
         else ERROR;
.....

これを実装するのは簡単ではありませんが、解析する前に型がわかっていれば、文字列からオブジェクト型を決定する最速の方法だと思います。

于 2012-09-19T20:06:47.800 に答える