我需要实现一个简短的 Map-Reduce 程序。我需要做的一项操作是将 txt 文件拆分为 X 部分,这样当我只对文件片段执行读取操作时,每个部分都将用作我的 Map 函数的输入。
我可以将文件拆分为更多本地文件,并将每个文件用作 Map 函数的输入。但我正在考虑尝试这个解决方案:在文件中的不同位置使用 InputStream 构建的 X 扫描仪中拆分文件。
当每个线程使用 Scanner 对象时,我会遇到同步问题吗?它会因为每个线程都试图访问同一个文件而变慢吗?
我需要实现一个简短的 Map-Reduce 程序。我需要做的一项操作是将 txt 文件拆分为 X 部分,这样当我只对文件片段执行读取操作时,每个部分都将用作我的 Map 函数的输入。
我可以将文件拆分为更多本地文件,并将每个文件用作 Map 函数的输入。但我正在考虑尝试这个解决方案:在文件中的不同位置使用 InputStream 构建的 X 扫描仪中拆分文件。
当每个线程使用 Scanner 对象时,我会遇到同步问题吗?它会因为每个线程都试图访问同一个文件而变慢吗?
原则上,如果你小心,那么如果操作系统允许你应该能够做到这一点。我建议为每个线程打开文件上的 BufferedReader,然后获取相应的 FileChannel 对象(通过 BufferedReader.getChannel())并锁定该线程打算处理的部分(请参阅 FileChannel.lock())。如果操作系统能让你走到这一步,我认为你不应该有任何实际问题。
但是,我想知道以这种方式做事是否有很多性能优势。如果可以的话,我怀疑从性能的角度来看,让单个线程通过文件串行执行实际读取,然后根据需要将连续行耕种到线程池,每个线程运行一个扫描仪。