我已经制作了一个包含4k * 4k花车的大文件。由于它是一个文本文件,我需要将其作为char字符串mmap并使用。现在我需要解析浮点数并写入2d数组。如果我使用strtok对其进行标记,则不允许我这样做,因为mmapped字符串不可修改。如果我将字符串复制到std :: string然后使用getline函数进行tokenize,它让我这样做,但我觉得我将失去从mmap获得的性能。我如何以最佳方式解决这个问题?
答案 0 :(得分:1)
您可以尝试一些不同的解决方案,但您必须进行基准测试才能找出最适合您的解决方案。并不总是很清楚mmap()
文件和直接处理内存映射页面是最好的解决方案。特别是如果您通过文件进行单个顺序传递,即使您将read()
与madvise()
一起使用,mmap()
一次分成缓冲区的循环也会更快。再次,基准,如果你想知道什么是最快的。
您可以尝试一些解决方案:
mmap()
与MAP_WRITE
和MAP_PRIVATE
,然后使用您现有的strtok()
代码。这将允许strtok()
写入它想要写入的NUL
个字节,而不会将这些更改反映在文件中。如果您选择此解决方案,您可能应该对已经处理的文件部分调用madvise(MADV_DONTNEED)
,否则内存使用量将呈线性增长。strtok()
变体,它返回匹配的令牌的长度,而不是NUL
- 终止的字符串。使用memchr()
并不困难。这样您就不需要修改内存了。然后,您可能需要将生成的标记传递给采用字符串和长度而不是NUL
- 终止字符串的函数。 C库中没有很多这样的函数,但即使如此,如果令牌保证以某些非数字分隔符结束,您也可以通过调用strtod()
之类的函数来逃脱。或者你可以将它们复制到一个小的堆栈分配缓冲区(它们是浮点数,它们不能那么长,对吗?)read()
- 和 - 流程循环代替mmap()
。