【发布时间】:2012-01-27 10:45:03
【问题描述】:
我通过读入块(Arraylist)对大文件进行排序,使用带有自定义比较器的 Collections.sort 对每个数组列表进行排序,并将排序结果写入文件,然后对所有文件应用合并排序算法。
我在一个线程中完成。
如果我为每个 Collections.sort() 启动一个新线程,我会得到任何性能提升吗?
我的意思是:
我从文件读入列表,当列表已满时,我启动一个新线程,对列表进行排序并写入临时文件。
同时我继续从文件中读取并在列表再次满时启动一个新线程......
我还有一个问题:
什么对排序更好:
1) 我填写的 Arraylist 和满时应用 collections.sort()
2)我填写的TreeMap,我不需要对其进行排序。 (在我插入项目时排序)
注意:我使用 JAVA 1.5
更新: 这是我要使用的代码,问题是我正在重用线程正在使用的数据线数组列表,而且我需要等到所有线程完成。 我该如何解决?
int MAX_THREADS = Runtime.getRuntime().availableProcessors();
ExecutorService executor = Executors.newFixedThreadPool(MAX_THREADS);
List datalines = ArrayList();
try {
while (data != null) {
long currentblocksize = 0;
while ((currentblocksize <= blocksize) && (data = getNext()) != null) {
datalines.add(data);
currentblocksize += data.length();
}
executor.submit(new Runnable() {
public void run() {
Collections.sort(datalines,mycomparator);
vector.add(datalines);
}
});
【问题讨论】:
-
列表中的“完整”是什么意思?您意识到,当您对这些子列表进行排序时,您不会对整个文件进行排序,对吧?
-
我的意思是我将列表限制为 1000 行文本。在我对子文件进行排序并将它们写入子文件后,我计划对它们进行合并排序。
-
啊,好吧 - 我错过了那一点。这个文件有多大?您真的需要将子列表写入文件吗?
-
是的,文件很大我无法在内存中排序
-
我看到你提到了“文本行”。我有 3 个问题: 1. 这个大文件是文本文件吗? 2. 你打开它是文本文件还是二进制文件? 3. 您使用的是什么操作系统?
标签: java multithreading file sorting