我正在从文件中读取大量数据:
//abc.txt
10 12 14 15 129
-12 14 -18 -900 -1234
145 12 13
12
32 68 51 76 -59 -025
- - - - etc
fun(char *p, int x, int y, int z) {
}
我尝试过使用atoi
、strtok
,但是当数组太大并且sscanf
也是时,它们是实时耗时的很慢。
如何提高海量数据的性能?
我正在使用 strtok
进行解析。我正在寻找解析每一行的快速方法。
我正在阅读每一行,然后将每一行解析为:
char * ptr;
ptr = strtok (str," ");
while (ptr != NULL)
{
int value1 = atoi(ptr) ;
ptr = strtok (NULL, " ");
}
- 有没有什么快速的方法可以将字符串解析成
int
? - 是否有比上述代码更快的替代方法?我正在使用
atoi
将char *
转换为int
。 - 我可以使用其他快速方法将
char *
转换为int
吗?
最佳答案
你找错地方了。问题不在于解析,除非您正在做一些真正奇怪的事情。在现代 N Ghz CPU 上,每行所需的周期很小。扼杀性能的是物理 I/O。旋转的东西往往以 10 秒/秒的速度运行。
我也怀疑问题出在文件的物理读取上,因为这将有效地缓存在文件系统缓存中。
不,正如 samy.vilar 所暗示的,问题几乎可以肯定是虚拟内存问题:
...the array is too huge...
使用系统监视器/psinfo/top 查看您的应用程序。几乎可以肯定的是,当它建立一个内存阵列时,它正在增长一个大型工作集,并且您的操作系统正在将其分页到磁盘。
所以忘记阅读吧。您真正的问题是如何操作内存中的大量数据集。这里的方法是多种多样的:
- 不要。对数据进行批处理并操作批处理。
- 使用节省空间的存储(例如紧凑元素)。
- 分配更多内存资源。
SO 上有很多关于这个的讨论。
关于c++ - 从文件中读取大量数据并以有效的方式解析日期。如何提高海量数据的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11077423/