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,我将向您展示如何做到这一点。

如前所述,以最佳方式使用文件系统与良好的扫描算法同样重要。你没有提供你的操作系统,所以我们无法帮助你。在许多操作系统中,内存映射(例如在 Linux 中mmap)是最快的。

于 2012-09-20T01:22:28.463 回答
0

在像您这样的简单情况下,IO 性能通常比 CPU 性能更重要。因此,例如,您应该确保获得正确的缓冲。

于 2012-09-20T00:33:36.797 回答
0

“将 [ing] 值推到各自的值”涉及什么?也许您的意思是相应的类或某种累加器变量/函数?如果您可以提供一个至少处理两种不同类别的数据的示例,这将大大有助于获得“最佳”答案。

现在我将假设数据完全按照您的问题所示。根据您在文本文件中指定类的方式,有更好的方法来 switch() 值,例如使用整数来避免下面使用的 strcmp()。

//伪代码

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

如果单毫秒很重要 - 然后尝试实现Trie 数据结构以获得最快的类型匹配。假设您已经阅读 typechar 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 回答