【问题标题】:Synchronization when using InputStream使用 InputStream 时的同步
【发布时间】:2012-11-24 23:42:47
【问题描述】:

我需要实现一个简短的 Map-Reduce 程序。我需要做的其中一项操作是将一个 txt 文件拆分为 X 个部分,这样当我只对文件片段执行读取操作时,每个部分都将用作我的 Map 函数的输入。

我可以将文件拆分为更多本地文件,并将每个文件用作 Map 函数的输入。但我正在考虑尝试这个解决方案:在使用 InputStream 构建的 X 扫描仪中将文件拆分到文件的不同位置。

当每个线程都使用 Scanner 对象时,我会遇到同步问题吗?会不会因为每个线程都在尝试访问同一个文件而变慢?

【问题讨论】:

  • 您可以将整个文件读取到字符串对象,然后在不同位置之间共享此字符串对象。或者我理解错了你需要什么。贴一些代码...
  • 如果 OP 需要使用 map/reduce 来处理文件,我怀疑它是否适合内存...

标签: java synchronization mapreduce java.util.scanner bufferedreader


【解决方案1】:

原则上,如果您小心,那么您应该能够做到这一点如果操作系统允许您这样做。我建议为每个线程打开文件上的 BufferedReader,然后获取相应的 FileChannel 对象(通过 BufferedReader.getChannel())并锁定该线程打算处理的部分(请参阅 FileChannel.锁())。如果操作系统能让你走到这一步,我认为你应该没有任何实际问题。

但是,我想知道以这种方式做事是否有很多性能优势。如果可以的话,我怀疑从性能的角度来看,让单个线程通过文件串行执行实际读取,然后根据需要将连续行耕种到线程池操作每个线程的扫描仪。

【讨论】:

  • 为什么要锁定文件才能读取? OP的问题没有提到文件在读取时可能会发生变化。
  • @jtahlborn,没错。另一种说法是,当多个线程从同一个文件中读取时,我们需要同步吗?
  • @Cookie503 - 不,你没有。如果文件不变,为什么需要同步?
猜你喜欢
  • 1970-01-01
  • 2016-06-18
  • 2012-02-13
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
  • 2014-09-10
相关资源
最近更新 更多