【问题标题】:Is there a way to write 1/4th of a file into a String buffer?有没有办法将文件的 1/4 写入字符串缓冲区?
【发布时间】:2013-02-09 10:22:27
【问题描述】:

我有一段代码作为。

File file = new File(path);
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
String temp;
StringBuffer sb=new StringBuffer();
while((temp=br.readLine())!=null){          
   sb.append(temp);
   sb.append(" ");
}

这将从文件中读取每一行并将其存储在 StringBuffer 中。我的文件非常大,我需要对它进行多线程处理,这样处理速度会更快。 有没有办法说我只想将文件的 1/4 写入缓冲区?

我知道我不能这么说。但我想要与此等价的东西。

for(int i=0; i<reader.length/4; i++)

【问题讨论】:

  • 我不认为你可以,但如果你提前知道四分之一,你可以在那个时候停止阅读。
  • 您的处理需要什么? (你对StringBuffer中的数据做了什么)?
  • “相当大”是什么意思?文件是否总是适合内存,还是太大了,您必须以这种方式避免 OutOfMemoryException?
  • 我有一个 12GB 的文件。我希望4个StringBuffers中的内容使用4个线程,这样处理效率更高。所以我想我可以破坏文件的内容。
  • “我的文件非常大,我需要多线程处理以加快处理速度”:从文件中读取数据通常慢于处理它。你确定 CPU 使用是瓶颈吗?

标签: java file bufferedreader filereader stringbuffer


【解决方案1】:

您应该能够为每个线程创建 1 个file channel,并在文件的偏移处使用它。从文件通道中,您可以获取文件的大小以计算拆分并设置其当前位置。

【讨论】:

    【解决方案2】:

    不,你无法解决这个问题,因为你不能同时读取文件,如果一次只有一个线程从流中读取,这将同时发生,而不是并行发生。所以那里没有任何好处,除此之外,您将拥有更难编写和阅读的代码,以及大量线程上下文切换和线程仲裁,这些都不便宜。

    你可以做的不是写一个大文件,而是写更多的小文件,如果读取数据的处理很耗时,则读取一个缓冲区,然后将该缓冲区加载到内存中并行处理,这效果会很好。

    此外,如果您使用的是单线程,请使用 StringBuilder 而不是 StringBuffer。

    希望这会有所帮助。

    【讨论】:

    • 我在四核中运行它。排除制造基板时的功率效率因素,我认为并行编程是拥有多个内核的目的之一。如果我错了,请纠正我。
    猜你喜欢
    • 2019-11-09
    • 2019-09-18
    • 2018-08-16
    • 2021-11-23
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    相关资源
    最近更新 更多