【问题标题】:Why is just reading a small file taking so long?为什么只是读取一个小文件需要这么长时间?
【发布时间】:2010-08-28 21:55:23
【问题描述】:

我正在做看起来像是从数据文件中简单读取的操作,而且它一直在开玩笑。 (我的意思是 300 毫秒。)这是有问题的代码:

BufferedReader f = new BufferedReader(new FileReader("input.txt"));
StringTokenizer st = new StringTokenizer(f.readLine());
int var1 = Integer.parseInt(st.nextToken())
int var2 = Integer.parseInt(st.nextToken());
Integer[][] people = new Integer[var1][];
for(int i = 0; i < var2; i++)
    f.readLine();
for(Integer i = 0; i < var1; i++)
{
    StringTokenizer line = new StringTokenizer(f.readLine(), " \t\n\r\f,");
    line.nextToken();
    Integer[] list = new Integer[line.countTokens()];
    for(int j = 0; j < drinks.length; j++)
        list[j] = Integer.parseInt(line.nextToken());
    people[i] = list;
}

这是相关的time 输出:

sammysmbp:fridgemadness_lean sfishman$ time java fridgemadness

real    0m0.311s
user    0m0.277s
sys  0m0.056s

只是我,还是真的,真的很慢。在这个例子中,它只经过 51 行输入。

【问题讨论】:

  • 这取决于输入文件。有多大?
  • @dark_charlie "51 行输入"
  • 您是否尝试过在您的应用中测量时间?然后您将忽略 java 运行时启动成本。 “java -version”在我的机器上需要 0.1 秒。
  • @Michael,线条可能会很长...
  • @Bart K. @dark_charlie,线条很短。每个字符 30 个左右。

标签: java performance file-io


【解决方案1】:

只是猜测,但可能很多时间都用于 jvm 启动。

在相关代码前后打印一个时间戳。如果我的猜测是正确的,那么接受请求的小型服务器可能有助于消除启动时间。

【讨论】:

  • 谢谢。只需在程序本身内对其进行计时,并在 1 毫秒内完成。其他时间显然都花在了系统上。
【解决方案2】:

模式中不需要 \r 或 \n,readLine() 已经删除了它们。

除了JVM启动之外,如果文件很长,大部分时间将花在读取到所需位置。也许行的文本文件不是正确的数据结构。

【讨论】:

    猜你喜欢
    • 2011-08-27
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 2021-07-26
    • 1970-01-01
    相关资源
    最近更新 更多