我有一个很大的文件要阅读并执行以下操作。
- 打开大文件(> 50MB)并逐行读取
- 执行一些比较操作
- 打印比较结果
- 返回
当我在单线程C代码中执行上述序列时,它可以正常工作,现在我试图通过创建3个线程(我有使用3个线程来使此过程更快的任务)来使用多线程来使其更快。读取并比较,但是我做不到,因为我发现它只是重复了一些比较。
我是否可以使用3个线程读取文件的3个不同部分并执行某些操作?
我有一个很大的文件要阅读并执行以下操作。
当我在单线程C代码中执行上述序列时,它可以正常工作,现在我试图通过创建3个线程(我有使用3个线程来使此过程更快的任务)来使用多线程来使其更快。读取并比较,但是我做不到,因为我发现它只是重复了一些比较。
我是否可以使用3个线程读取文件的3个不同部分并执行某些操作?
请注意,此答案是“ 技巧”(或者可能是作业是技巧吗?),因为它并没有真正使过程更快。答案假定具有合理(4G +)内存的标准Linux计算机。
简短答案:在任何半适当的配置中,数据都会移入OS缓冲区,而问题实际上是CPU约束,而不是IO约束。
长答案:
尽管50MB的文件对于人类来说是“大”的,但对于每台现代计算机而言,它都是“小”的。实际上,除非系统需要内存来执行其他任务,否则数据将移入OS缓冲区并保持在那里。
鉴于数据位于(OS)内存中,问题(不是初始调用)不是IO绑定的,而是CPU的。对于此3线程MT程序将发挥作用。问题成为如何将工作分散到3个文件中。理想情况下,这3个线程会将文件划分为3个(几乎)相等的块,每个块均由自己处理。
解决方案是伪代码,实际代码将不得不处理分割块的行的处理,错误检查等。
"scripts": {
"start": "ng serve --proxy-config proxy.conf.json"
}
可能可以使用'mmap'使其更快。但是,问题要求进行行处理,并且鉴于这不是实际问题,因此不确定是否值得付出额外的努力。