【问题标题】:Fastest way to read a text file of strings line by line [duplicate]逐行读取字符串文本文件的最快方法[重复]
【发布时间】:2012-02-20 04:33:56
【问题描述】:

可能重复:
What is the Fastest Method for High Performance Sequential File I/O in C++?

我环顾了一下,仍然不确定这个问题的答案。

从每行包含任意单词的文本文件中读取时,从该文件中读取单词的绝对最快方法是什么?项目范围要求尽可能快的文件读取。

在 Windows 7 上使用 Visual Studio。不考虑跨平台。

编辑: 请记住,这个文件读取是一次性的,它不会被再次读取,也不会被写入。程序启动,从文件中读取,将其推送到数据结构中,并且永远不会再次调用 loadFile() 函数。

【问题讨论】:

  • 不确定内存映射是否适用于我所处的情况。
  • 不是重复的;另一个问题是关于写入的。
  • @MSalters:来吧,另一个问题是关于“I/O”的。读取和写入。

标签: c++ windows performance file-io


【解决方案1】:

您将此标记为“多线程”这一事实使我认为您正在考虑对文件进行线程读取。我真的真的建议您重新考虑,因为这会导致非常棘手的并发问题抬起他们丑陋的头脑。您将不得不深入研究互斥锁、信号量和进程间通信的兔子洞,即使是最优秀的开发人员也会为线程之前的美好时光而哭泣。

您有一个 .txt 文件,并且该文件中有要阅读的单词。您必须打开文件,并且必须阅读每个单词。只是没有办法绕过它。除非您愿意将文本文件处理成用于并发访问的数据结构(intel TBB 有一些好的),否则最好的选择可能是在一切都是本地的之后进行单线程读取并将数据传递给其他线程。

【讨论】:

  • 好的,感谢您的建议,“您必须打开文件,并且必须阅读每个字。无法绕过它。”现在我的问题是,最快的方法是什么?我已经有一个数据结构,我正在将这些词放入其中,所以目前这不是问题。
【解决方案2】:

要么对文件进行内存映射,要么以固定大小的大块读取文件并处理内存中的数据。

【讨论】:

  • 在链接的问题中有详细的建议。
  • @Reuben 碰巧的是,windows 假定顺序访问,直到它看到非顺序访问。
  • @DavidSchwartz 你是在暗示这个标志是无操作的吗? Windows 文档似乎另有说明。
【解决方案3】:

据我了解您的问题,您的目标是读取一个单词文件并将每个单词插入某个数据结构中。您希望此读取+插入尽可能快。 (我不会争论这样做的理由或智慧,我会接受这是一个要求。:-)) 如果我的理解是正确的,那么也许另一种方法是编写一个实用程序来读取单词文件,将它们插入数据结构中,然后将该数据结构序列化到文件中(例如 BLOB.dat )。然后您的主程序会将 BLOB.dat 反序列化为您需要的数据结构。本质上,您将单词文件预处理为一些可以最有效地加载到您的数据结构中的中间二进制格式。或者这会在你的场景中作弊吗??

【讨论】:

  • 好主意!但是在这种情况下这有点作弊;)
【解决方案4】:

对文件进行内存映射。作为Raymond Chen explains,这会扼杀顺序访问优化。由于磁盘很慢,预取将使磁盘保持忙碌,因此吞吐量会更高。

【讨论】:

  • Raymond 并没有说内存映射更慢,他只是说它没有通过缓存管理器。
【解决方案5】:

您的文件可能会尽可能快地自行加载。毕竟大多数文件操作只是调用相同的系统调用。据说 IOstreams 比 cstdio 慢,但我建议您在此处使用分析工具来在这里找到最佳选项集。调整缓冲区大小以满足您的需要。但是,不幸的是,对于大文件,您大部分时间都将花费在等待 IO 上,只有极少的时间用于处理。调整加载方式不会给您带来太多收益。

但既然你要等待,请确保你明智地利用你的时间。

在应用程序启动时立即生成一个线程来加载文件,并利用这段时间做其他事情。如果您需要数据做任何事情,请将读取文件的块传递给另一个线程进行处理。

【讨论】:

    猜你喜欢
    • 2018-07-10
    • 1970-01-01
    • 2011-06-29
    • 2013-10-19
    • 2011-08-13
    • 2011-12-23
    • 2012-11-27
    • 2021-12-08
    相关资源
    最近更新 更多