1
Java를 사용하여 거대한 파일의 단어 수를 계산하고 싶습니다. 단일 기계로 인해 맵 축소를 사용할 수 없습니다. 해시 맵을 사용하는 대신 Redis를 사용하여 단어 빈도를 저장하고 싶습니다. 실용적인 데이터가 흐르고 있습니다.Redis를 사용하여 거대한 파일의 단어 수에 대한 최적의 솔루션
내가 redis 정렬 된 각 집합에 대해 단어 개수를 밀어 넣을 것이라고 생각한 내용. 그러나 나는 이것이 최적의 해결책이 아니라는 것을 잘 모른다. 스트리밍 데이터의 단어를 세는 최적의 솔루션을 제공해주십시오. 단어에 대한
자바 코드 계산 -
은public class WordCount {
public static void main(String args[]) {
Map<String, Integer> wordMap = wordMap("filename");
List<Entry<String, Integer>> list = sortByValue(wordMap);
for (Map.Entry<String, Integer> entry : list) {
System.out.println(entry.getKey() + " => " + entry.getValue());
}
}
public static Map<String, Integer> wordMap(String fileName) {
Map<String, Integer> wordMap = new HashMap<>();
try (FileInputStream fis = new FileInputStream(fileName);
DataInputStream dis = new DataInputStream(fis);
BufferedReader br = new BufferedReader(new InputStreamReader(dis))) {
// words are separated by whitespace
Pattern pattern = Pattern.compile("\\s+");
String line = null;
while ((line = br.readLine()) != null) {
line = line.toLowerCase();
String[] words = pattern.split(line);
for (String word : words) {
if (wordMap.containsKey(word)) {
wordMap.put(word, (wordMap.get(word) + 1));
} else {
wordMap.put(word, 1);
}
}
}
} catch (IOException ioex) {
ioex.printStackTrace();
}
return wordMap;
}
public static List<Entry<String, Integer>> sortByValue(Map<String, Integer> wordMap) {
Set<Entry<String, Integer>> entries = wordMap.entrySet();
List<Entry<String, Integer>> list = new ArrayList<>(entries);
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2)
{
return (o2.getValue()).compareTo(o1.getValue());
}
});
return list;
}
}