我有一個Map<byte[], Element>
,我想對它進行排序並將其寫入磁盤,以便我有一個文件,其中包含按照Guava的UnsignedBytes.lexicographicalComparator
鍵排序的所有元素。將散列表映射到磁盤上的最快方法
我在做什麼現在的問題是:
HashMap<byte[], Element> memory;
// ... code creating and populating memory ...
TreeMap<byte[], Element> sortedMap = new TreeMap<byte[], Element>(UnsignedBytes.lexicographicalComparator());
sortedMap.putAll(memory.getMap());
MyWriter writer = new MyWriter("myfile.dat");
for (Element element: sortedMap.values())
writer.write(element);
writer.close();
它可能很難作出排序快(O(nlogn)),問題是我是否能改善排序列表的導航。理想情況下,我將排序爲ArrayList
而不是TreeMap
,以便迭代它會非常快。
我想過把HashMap放入一個ArrayList
和Collections.sort()
它,但這需要比實際解決方案更多的複製。
任何想法?
編輯:
我在這裏添加我的測試與ArrayList
這是快兩倍,但我相信它使用更多的內存。也許對這個假設有些評論?
// ArrayList-based implementation 2x faster
ArrayList<Element> sorted = new ArrayList<Element>(memory.size());
sorted.addAll(memory.values());
final Comparator<byte[]> lexic = UnsignedBytes.lexicographicalComparator();
Collections.sort(sorted, new Comparator<Element>(){
public int compare(Element arg0, Element arg1) {
return lexic.compare(arg0.getKey(), arg1.getKey());
}
});
MyWriter writer = new MyWriter(filename);
for (Element element: sorted)
writer.write(element);
writer.close();
您需要改進的主要問題是寫入磁盤。這比你做的任何事都要慢100倍。我會用分析器來檢查你在哪裏花時間。 – 2011-05-16 17:53:51
這裏幾乎沒有什麼改進,我已經在使用DataOutputStream和緩衝,這很容易的順序方法。正如我的微基準所示,排序和迭代有所不同。 – marcorossi 2011-05-16 18:30:58
爲什麼你說要製作一個ArrayList>(例如)並對它進行排序需要比構建TreeMap更多的「複製」? –
karmakaze
2011-05-16 18:45:22