我想解析
CLASSA classAvalue;
CLASSB classBvalue;
... ....
CLASSX classXvalue;
文件中的文字..
他们的订单无法预测 即;
CLASSX classXvalue;
CLASSY classYvalue;
.... ......
CLASSA classAvalue;
CLASSB classBvalue;
我有名称A,B,C ......的类/结构,我需要将值推到各自的值,我想保持简单,不使用正则表达式解析此文本..
RUNTIME对我来说至关重要..我有一个文件,其中有300MB的数据需要解析,
我想到了对字符串strtok()进行标记的想法..但是在推送tvalue之前我必须比较我正在推送的数据类型......这需要一些时间..
我希望如何优化将数据推送到相关类的方式..即使毫秒也很重要,最后我可能会节省几秒钟的运行时间。
请分享你对此的看法,我会很感激..
答案 0 :(得分:1)
您对问题的描述需要更多细节。如果令牌可以表示为作为正则表达式(我不是说实际使用RE,而只是询问它是否可行),那么扫描它们的最快方法就是手动编码离散有限自动机。如果你给RE,我会告诉你如何做到这一点。
如前所述,以最佳方式使用文件系统与良好的扫描算法同样重要。你没有给你的操作系统,所以我们无法帮助你。在许多操作系统中,内存映射(例如在Linux中,mmap
)是最快的。
答案 1 :(得分:0)
“将值推送到各自的值”涉及什么?也许你的意思是各自的类或某种累加器变量/函数?如果你能提供一个至少两个不同类别的数据的例子,这些数据将大大有助于获得“最佳”答案。
现在,我将假设数据完全按照您的问题显示。根据您在文本文件中指定类的方式,有更好的方法来切换值,例如使用整数来避免使用下面的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;
}
}
答案 2 :(得分:0)
如果单毫秒很重要 - 那么尝试实现Trie data structure以获得最快的类型匹配。假设您已将类型读取到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;
.....
这不是很容易实现 - 但我相信这是从字符串中确定对象类型的最快方法,只要你在解析之前知道类型。
答案 3 :(得分:0)
在像您这样的简单情况下,IO性能通常比CPU性能更重要。所以你应该确保你正确地获得缓冲,例如。