我试图读取30GB(2500万行)的大文件的文件。我想编写一个代码,它将创建一个线程池,每个线程将并行读取1000行(第一个线程将读取前1000行,第二个线程读取下一个1000行,等等)。 我已经阅读了整个文件并创建了线程池,但现在我坚持如何确保每个线程只读取1000行,并跟踪已读取的行号以便下一个线程不必读取那些线。使用多线程读取30GB文件
1
A
回答
0
A.如果是acceaptable所有的线程都行大致均等的,您可以:
- 假设线程池的大小是N,1号线力求文件偏移0和阅读[0,30GB/N ),第二个线程寻求抵消30GB/N,读取[30GB/N,30GB/N * 2)等。
- 第二个线程可能不在一行的开头,而是在一行的中间。没关系。只需跳过paritial行,并阅读完整的行。第一条线可以以部分线结束。没关系,只要继续阅读,直到阅读'\ n'。其余的线程做同样的事情。
B.如果所有线程都必须有行正好euqal数,这是说1000线,您可以:
- 有一个线程读取整个文件,建立索引地图。该地图具有像line0〜line999开始偏移量0,线1000〜line1999开始偏移量13521等信息...
- 所有线程从相应的偏移读取文件,并读取1000行。
方法A读取文件1次。方法B读取文件2次。
使用方法A或B,可以使所有线程并行处理文件(转换,提取,清理..)。但是,如果处理速度非常快,则界限就是磁盘速度。然后你的应用程序被IO绑定。你应该只需要一个线程读取文件并连续执行处理。
相关问题
- 1. 多线程读取文件
- 2. 使用PHP Pthread同时读取多个CSV文件(多线程)
- 3. 通过多线程读取文件
- 4. 如何使用多线程读取文件?
- 5. 文件读取写入使用多线程
- 6. 使用线程提高磁盘读取性能(多个文件)
- 7. 读取使用多线程Java中
- 8. 只使用多线程读取一行
- 9. 用多线程读取ifstream的相同文件(pthread)
- 10. 用多线程读取单个文件:应该加快速度?
- 11. 用mmap读取文件中的多线程C
- 12. 多线程MSMQ读取
- 13. 读取多个线程
- 14. 多线程Zip文件阅读器
- 15. Java使用扫描仪读取文件,然后读取线
- 16. C信号量线程读取文件
- 17. 使用Python的多线程读写文件
- 18. 使用getline从文件读取多行?
- 19. 使用多线程读取文件时的同步和异步操作
- 20. 如何使用多线程读取大量文件,请帮助我!
- 21. 在java中使用线程概念读取N个文件
- 22. c#多线程文件读取和页面解析
- 23. 从同一文件读取多个线程
- 24. 如何多线程读取C++ 11中的文件?
- 25. 以2KB大小读取python中的多线程文件。
- 26. spring批处理多线程文件读取
- 27. 如何提高多线程文件读取的性能?
- 28. 从python中的多个线程读取单个文件
- 29. 多从在bash一个txt文件读取(线程)
- 30. PHP读取30K线文件
一旦你解决了这个问题,你使用磁力驱动器?无论如何,这将会是IO界限。 –
让1个线程读取大块(30GB)通常会比25000个线程读取小块快。 25000个线程有很多开销,如果它是1个文件驻留在1个磁盘上,那么每个线程都必须等待队列中的访问时间。 –
您通常应该只有一个线程处理外部资源,例如文件。不要试图分发不会提高性能的I/O,而是让读者将每个捆绑包发布到并发队列中和/或发送给执行程序任务。 – chrylis