Я пытаюсь выполнить однократное чтение большого файла (~ 4 ГБ) с использованием Java 5.0 x64 (в Windows XP).Производительность ввода-вывода файлов Java уменьшается со временем
Первоначально скорость чтения файла очень быстрая, но постепенно пропускная способность замедляется существенно, и моя машина кажется очень не реагирующей с течением времени.
Я использовал ProcessExplorer для мониторинга статистики ввода-вывода файлов, и похоже, что процесс изначально считывает 500 МБ/с, но эта скорость постепенно снижается до 20 МБ/с.
Любые идеи по наилучшему способу поддержания скорости ввода-вывода файлов, особенно при чтении больших файлов с использованием Java?
Вот несколько тестовых кодов, которые показывают, что «интервал времени» продолжает увеличиваться. Просто передайте Main файл размером не менее 500 МБ.
import java.io.File;
import java.io.RandomAccessFile;
public class MultiFileReader {
public static void main(String[] args) throws Exception {
MultiFileReader mfr = new MultiFileReader();
mfr.go(new File(args[0]));
}
public void go(final File file) throws Exception {
RandomAccessFile raf = new RandomAccessFile(file, "r");
long fileLength = raf.length();
System.out.println("fileLen: " + fileLength);
raf.close();
long startTime = System.currentTimeMillis();
doChunk(0, file, 0, fileLength);
System.out.println((System.currentTimeMillis() - startTime) + " ms");
}
public void doChunk(int threadNum, File file, long start, long end) throws Exception {
System.out.println("Starting partition " + start + " to " + end);
RandomAccessFile raf = new RandomAccessFile(file, "r");
raf.seek(start);
long cur = start;
byte buf[] = new byte[1000];
int lastPercentPrinted = 0;
long intervalStartTime = System.currentTimeMillis();
while (true) {
int numRead = raf.read(buf);
if (numRead == -1) {
break;
}
cur += numRead;
if (cur >= end) {
break;
}
int percentDone = (int)(100.0 * (cur - start)/(end - start));
if (percentDone % 5 == 0) {
if (lastPercentPrinted != percentDone) {
lastPercentPrinted = percentDone;
System.out.println("Thread" + threadNum + " Percent done: " + percentDone + " Interval time: " + (System.currentTimeMillis() - intervalStartTime));
intervalStartTime = System.currentTimeMillis();
}
}
}
raf.close();
}
}
Спасибо!
Нужна более подробная информация, что вы делаете после прочтения файла? Вы пишете материал на жесткий диск? У вас есть антивирусные сканеры в фоновом режиме? Вы используете буферизованный ввод-вывод? – Pyrolistical 2008-12-04 21:35:53
Сохраняете ли вы какое-либо содержимое файла в памяти? Является ли пространство кучи вашего Java-процесса полным? – 2008-12-04 21:36:20