gpt4 book ai didi

java - 执行速度很慢

转载 作者:行者123 更新时间:2023-11-29 03:46:19 25 4
gpt4 key购买 nike

我有一个基本方法,可以从硬盘读取约 1000 个文件,每个文件约 10,000 行。另外,我有一个 String 的数组称为 userDescription其中包含用户的所有“描述词”。我创建了一个 HashMap,它的数据结构是 HashMap<String, HashMap<String, Integer>>对应于 HashMap<eachUserDescriptionWords, HashMap<TweetWord, Tweet_Word_Frequency>> .

文件组织如下: <User=A>\t<Tweet="tweet...">\n
<User=A>\t<Tweet="tweet2...">\n
<User=B>\t<Tweet="tweet3...">\n
....

我的方法是:

for (File file : tweetList) {
if (file.getName().endsWith(".txt")) {
System.out.println(file.getName());
BufferedReader in;
try {
in = new BufferedReader(new FileReader(file));
String str;
while ((str = in.readLine()) != null) {
// String split[] = str.split("\t");
String split[] = ptnTab.split(str);
String user = ptnEquals.split(split[1])[1];
String tweet = ptnEquals.split(split[2])[1];
// String user = split[1].split("=")[1];
// String tweet = split[2].split("=")[1];

if (tweet.length() == 0)
continue;

if (!prevUser.equals(user)) {
description = userDescription.get(user);
if (description == null)
continue;
if (prevUser.length() > 0 && wordsCount.size() > 0) {
for (String profileWord : description) {
if (wordsCorr.containsKey(profileWord)) {
HashMap<String, Integer> temp = wordsCorr
.get(profileWord);
wordsCorr.put(profileWord,
addValues(wordsCount, temp));
} else {
wordsCorr.put(profileWord, wordsCount);
}
}
}
// wordsCount = new HashMap<String, Integer>();
wordsCount.clear();
}
setTweetWordCount(wordsCount, tweet);
prevUser = user;
}
} catch (IOException e) {
System.err.println("Something went wrong: "
+ e.getMessage());
}
}
}

在这里,方法setTweetWord统计单个用户所有推文的词频。方法是:

private void setTweetWordCount(HashMap<String, Integer> wordsCount,
String tweet) {

ArrayList<String> currTweet = new ArrayList<String>(
Arrays.asList(removeUnwantedStrings(tweet)));

if (currTweet.size() == 0)
return;

for (String word : currTweet) {
try {
if (word.equals("") || word.equals(null))
continue;
} catch (NullPointerException e) {
continue;
}

Integer countWord = wordsCount.get(word);
wordsCount.put(word, (countWord == null) ? 1 : countWord + 1);
}
}

addValues 方法检查是否 wordCount有已经在巨大的 HashMap wordsCorr 中的单词。如果是,它会增加原始 HashMap 中单词的计数 wordsCorr .

现在,我的问题是无论我做什么程序都非常非常慢。我在我的服务器上运行了这个版本,它的硬件相当不错,但已经 28 小时了,扫描的文件数量只有 ~450 个。我试着看看我是否在重复做任何可能不必要的事情,我纠正了其中的几个。但是程序仍然很慢。

此外,我已将堆大小增加到 1500m,这是我可以达到的最大值。

有什么我可能做错的吗?

感谢您的帮助!

编辑分析结果首先,我真的很想感谢你们的评论。我已经更改了程序中的一些内容。我现在有预编译的正则表达式而不是直接 String.split()和其他优化。然而,在分析之后,我的 addValues方法花费的时间最长。所以,这是我的代码 addValues .我应该在这里优化什么吗?哦,我也改变了我的 startProcess方法一点。

  private HashMap<String, Integer> addValues(
HashMap<String, Integer> wordsCount, HashMap<String, Integer> temp) {

HashMap<String, Integer> merged = new HashMap<String, Integer>();

for (String x : wordsCount.keySet()) {
Integer y = temp.get(x);
if (y == null) {
merged.put(x, wordsCount.get(x));
} else {
merged.put(x, wordsCount.get(x) + y);
}
}

for (String x : temp.keySet()) {
if (merged.get(x) == null) {
merged.put(x, temp.get(x));
}
}
return merged;
}

EDIT2: 即使在如此努力之后,该程序仍未按预期运行。我做了“慢方法”的所有优化addValues但它没有用。所以我去了不同的路径创建单词字典并首先为每个单词分配索引然后进行处理。让我们看看它去了哪里。感谢您的帮助!

最佳答案

我想到了两件事:

  • 您正在使用 String.split(),它使用正则表达式 进行拆分。这完全是超大的。请改用 Apache StringUtils 中的众多 splitXYZ() 方法之一。
  • 您可能正在创建非常庞大的 HashMap 。当具有非常大的散列映射时,散列冲突将使散列映射函数变得更慢。这可以通过使用更广泛传播的哈希值来改进。看这里的例子:Java HashMap performance optimization / alternative

关于java - 执行速度很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10707683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com