我在网上发现了这个问题。如何处理大小如10G的大型数据文件? 这应该是一个面试问题。有没有系统的方法来回答这类问题?如何处理大小如10G的大型数据文件?
回答
将“大”数据文件从小文件中分离出来的原因 - 一般来说 - 是将整个文件整合到内存中,还是一次只能从磁盘中加载部分文件。
如果文件太大以至于无法将整个文件加载到内存中,则可以通过识别文件的有意义的块来处理它,然后串行读取并处理它们。你如何定义“有意义的块”将很大程度上取决于文件的类型。 (即,二进制图像文件将需要与大量xml文档不同的处理)。
这取决于文件以及文件中的数据如何关联。如果您在谈论某些需要处理并输出到数据库或其他文件的独立记录,那么对多线程进程进行多线程将会有所帮助。有一个线程读取记录,然后将其传递给多个线程中的一个线程,这些线程将执行处理数据和执行相应输出的耗时工作。
我在这种情况下使用了基于流的处理。一个例子是当我不得不从ftp服务器下载一个相当大的(在我的情况下〜600 MB)csv文件时,提取找到的记录并将它们放入数据库。我结合三流相互阅读:
- 从
- 创纪录的工厂,从
- 一个ftp阅读器类下载的FTP流中读取文本流中读取的记录流数据库插入从服务器。
这样我就不必在本地存储整个文件,所以它应该可以处理任意大文件。
尽管流通常是一种明智的方法,但使用它们时假定处理数据元素不依赖于其他数据元素。如果数据高度相互依赖,则流式传输几乎不起作用。 – 2010-03-17 19:03:06
除了Bill Carey所说的,文件类型不仅决定了“有意义的块”,还确定了“处理”的含义。
换句话说,你要做什么来处理,你如何确定要处理的东西会有很大的不同。
寻找机会分割文件,以便可以通过多个进程处理它。您不会说文件中的记录是否相关,这会使问题更难,但解决方案原则上相同 - 识别可以并行处理的数据的互斥分区。
后来我需要处理数百万个测试数据记录,以进行一些性能测试,我在大规模并行计算机上进行测试。我使用了一些Perl将输入文件分成32个部分(以匹配CPU数量),然后产生了32个进程,每个进程将记录转换为一个文件。
因为这项工作并行地运行在32个处理器上,所以花费了几分钟的时间,而不是连续几个小时。我很幸运,在文件中的任何记录之间没有依赖关系。
- 1. 如何处理大型文本文件?
- 2. PowerShell如何处理大型数据集?
- 3. 如何处理大型数据库?
- 4. 如何处理大型数据列表
- 5. 如何处理大型Excel文件?
- 6. 如何处理大型MXML文件
- 7. 如何处理最大文件大小Spring Boot中的异常?
- 8. 如何为大型数据集中的python多处理选择块大小
- 9. 如何处理大图像大小?
- 10. 大型数据库处理
- 11. 处理大型数据集
- 12. 处理大型json文件
- 13. 处理大型xlsx文件
- 14. 处理大型XML文件
- 15. 处理大型XML文件
- 16. 可以jsoup处理大小约1GB的大型HTML文件
- 17. 很多文本文件中的大量数据 - 如何处理?
- 18. Javamail - 如何处理大型附件?
- 19. 处理复杂数据+大型数据文件的建议
- 20. SQL Server 2008 R2如何处理小页面大小的大数据?
- 21. 如何处理Haxe的大数据?
- 22. 如何处理非常大的数据?
- 23. 如何获取大型(> 4 GB)文件的文件大小?
- 24. 如何处理gae上的大文件
- 25. 如何处理SbreDav中的大文件?
- 26. 如何处理python中的大文件?
- 27. 如何处理大的html/js文件?
- 28. 根据文件大小移动文件的批处理文件
- 29. 如何处理mongo map中的大型数据集缩小函数
- 30. 如何处理R上的RAM大小
我会说,这是无法解析的,不知道什么样的文件或你需要做什么处理。我的猜测是,这个问题的目的是在大文件的背景下引发对这些考虑的讨论。 – 2010-03-17 18:10:42
您需要使用支持大量文件的API - 使用32位整数,因此仅限于4GB文件。如果你想要更多,你必须更具体地了解文件中的数据以及你想要做什么。 – 2010-03-17 18:12:02
MapReduce? [http://en.wikipedia.org/wiki/MapReduce] – 2010-03-17 18:12:16