Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Сборщик мусора тормозит / 25 сообщений из 59, страница 1 из 3
25.06.2014, 22:26
    #38680349
petrovichtim
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора тормозит
Добрый день, дорогие коллеги!
Есть архив с примерно 5000 файлов размером 130 мегабайт.
Вот код его распаковки
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
public static void unzip(String zipFile, String location) throws IOException {
        try {
            File f = new File(location);
            if(!f.isDirectory()) {
                f.mkdirs();
            }
            ZipInputStream zin = new ZipInputStream(new FileInputStream(zipFile));
            try {
                ZipEntry ze = null;
                while ((ze = zin.getNextEntry()) != null) {
                    String path = location + ze.getName();

                    if (ze.isDirectory()) {
                        File unzipFile = new File(path);
                        if(!unzipFile.isDirectory()) {
                            unzipFile.mkdirs();
                        }
                    }
                    else {
                        FileOutputStream fout = new FileOutputStream(path, false);
                        try {
                            for (int c = zin.read(); c != -1; c = zin.read()) {
                                fout.write(c);
                            }
                            zin.closeEntry();
                        }
                        finally {
                            fout.close();                           
                        }
                    }
                }
            }
            finally {
                zin.close();
            }
        }
        catch (Exception e) {
            Log.e(TAG, "Unzip exception", e);
        }
    }


Помогите оптимизировать распаковку, т.к. в консоле LogCat андроида ругается сборщик мусора.
...
Рейтинг: 0 / 0
25.06.2014, 22:32
    #38680351
buldozer01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора тормозит
petrovichtimДобрый день, дорогие коллеги!
Есть архив с примерно 5000 файлов размером 130 мегабайт.
Вот код его распаковки
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
public static void unzip(String zipFile, String location) throws IOException {
        try {
            File f = new File(location);
            if(!f.isDirectory()) {
                f.mkdirs();
            }
            ZipInputStream zin = new ZipInputStream(new FileInputStream(zipFile));
            try {
                ZipEntry ze = null;
                while ((ze = zin.getNextEntry()) != null) {
                    String path = location + ze.getName();

                    if (ze.isDirectory()) {
                        File unzipFile = new File(path);
                        if(!unzipFile.isDirectory()) {
                            unzipFile.mkdirs();
                        }
                    }
                    else {
                        FileOutputStream fout = new FileOutputStream(path, false);
                        try {
                            for (int c = zin.read(); c != -1; c = zin.read()) {
                                fout.write(c);
                            }
                            zin.closeEntry();
                        }
                        finally {
                            fout.close();                           
                        }
                    }
                }
            }
            finally {
                zin.close();
            }
        }
        catch (Exception e) {
            Log.e(TAG, "Unzip exception", e);
        }
    }


Помогите оптимизировать распаковку, т.к. в консоле LogCat андроида ругается сборщик мусора.

Код: java
1.
2.
3.
4.
                            for (int c = zin.read(); c != -1; c = zin.read()) {
                                fout.write(c);
                            }
                            zin.closeEntry();



Может стоит иногда сбрасывать на диск из памяти ?
...
Рейтинг: 0 / 0
25.06.2014, 22:51
    #38680358
petrovichtim
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора тормозит
оно ?
Код: java
1.
fout.flus();
...
Рейтинг: 0 / 0
25.06.2014, 22:58
    #38680362
buldozer01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора тормозит
)) попробуйте
...
Рейтинг: 0 / 0
25.06.2014, 23:05
    #38680365
buldozer01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора тормозит
Судя по

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/io/FileOutputStream.java#FileOutputStream.write(int)

не поможет flush

Снимите heapdump посмотрите хип
...
Рейтинг: 0 / 0
25.06.2014, 23:21
    #38680375
petrovichtim
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора тормозит
Собственно close должнен вызывать flush но не у всех потоков.
Посмотрел чужие примеры, везде ставят flush
...
Рейтинг: 0 / 0
26.06.2014, 09:02
    #38680492
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора тормозит
petrovichtimЕсть архив с примерно 5000 файлов размером 130 мегабайт.
Форменное издевательство над андроидом... Это не основном потоке, надеюсь, делается?
...
Рейтинг: 0 / 0
26.06.2014, 09:40
    #38680527
petrovichtim
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора тормозит
wadman,
Само собой
...
Рейтинг: 0 / 0
26.06.2014, 09:50
    #38680543
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора тормозит
petrovichtimВот код его распаковки

BufferedOutputStream и BufferedInputStream не пробовали добавить?
...
Рейтинг: 0 / 0
26.06.2014, 09:50
    #38680545
petrovichtim
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора тормозит
Вот так ругается консолька
авторGC_CONCURRENT freed 1170K, 20% free 7646K/9479K, paused 1ms+2ms
...
Рейтинг: 0 / 0
26.06.2014, 09:53
    #38680547
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора тормозит
Вот это странный код.
Код: java
1.
2.
3.
if(!unzipFile.isDirectory()) {
    unzipFile.mkdirs();
}
...
Рейтинг: 0 / 0
26.06.2014, 10:01
    #38680556
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора тормозит
Надо бы попрофилировать. Потому что код, в целом, если не считать отсутствие буфера, нормальный.
https://developer.android.com/tools/debugging/debugging-memory.html
...
Рейтинг: 0 / 0
26.06.2014, 10:02
    #38680560
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора тормозит
petrovichtimwadman,
Само собой
Тогда наверное стоит вставить какую-нибудь малозначительную паузу между файлами?
...
Рейтинг: 0 / 0
26.06.2014, 10:14
    #38680572
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора тормозит
wadmanТогда наверное стоит вставить какую-нибудь малозначительную паузу между файлами?
Интересный совет. Действительно, если распаковка занимает большое количество времени CPU, то GC может просто не успеть расшириться\отработать. С другой стороны должны быть большие простои на IO. Которые должны заменить эти паузы.
...
Рейтинг: 0 / 0
26.06.2014, 11:49
    #38680660
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора тормозит
petrovichtim
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
                        FileOutputStream fout = new FileOutputStream(path, false);
                        try {
                            for (int c = zin.read(); c != -1; c = zin.read()) {
                                fout.write(c);
                            }
                            zin.closeEntry();
                        }
                        finally {
                            fout.close();                           
                        }

Побайтовая перекачка данных - не лучшее решение:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
byte[] buffer = new byte[4*1024];
int count;
try {
  FileOutputStream fout = new FileOutputStream( path, false );
  while ( 0 > count = zin.read( buffer ) ) fout.write( buffer, 0, count );
}
finally {
  fout.close()
}
...
Рейтинг: 0 / 0
26.06.2014, 11:52
    #38680662
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора тормозит
Только неравенство должно быть нестрогое.
...
Рейтинг: 0 / 0
26.06.2014, 11:53
    #38680663
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора тормозит
Basil A. SidorovПобайтовая перекачка данных - не лучшее решение:
Код: sql
1.
byte[] buffer = new byte[4*1024];


Свой буфер аналогично.
http://developer.android.com/reference/java/io/BufferedOutputStream.html
Сотню тактов процессора, разве что, можно сэкономить.
...
Рейтинг: 0 / 0
26.06.2014, 13:47
    #38680804
petrovichtim
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора тормозит
Basil A. Sidorovpetrovichtim
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
                        FileOutputStream fout = new FileOutputStream(path, false);
                        try {
                            for (int c = zin.read(); c != -1; c = zin.read()) {
                                fout.write(c);
                            }
                            zin.closeEntry();
                        }
                        finally {
                            fout.close();                           
                        }

Побайтовая перекачка данных - не лучшее решение:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
byte[] buffer = new byte[4*1024];
int count;
try {
  FileOutputStream fout = new FileOutputStream( path, false );
  while ( 0 > count = zin.read( buffer ) ) fout.write( buffer, 0, count );
}
finally {
  fout.close()
}


Спасибо!
Решил вот так
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
protected Void doInBackground(Void... arg0) {
		int size;
		int totalSize;
		int currentSize = 0;
		byte[] buffer = new byte[2048];
		try {
			File f = new File(location);
			if (!f.isDirectory()) {
				f.mkdirs();
			}
			FileInputStream fis = new FileInputStream(zipFile);
			totalSize=fis.available();
			ZipInputStream zin = new ZipInputStream(fis);
			try {
				ZipEntry ze = null;					
				while ((ze = zin.getNextEntry()) != null) {
					currentSize+= ze.getCompressedSize();
					String path = location + ze.getName();						
					if (ze.isDirectory()) {
						File unzipFile = new File(path);
						if (!unzipFile.isDirectory()) {
							unzipFile.mkdirs();
						}
					} else {
						FileOutputStream fout = new FileOutputStream(path,
								false);
						BufferedOutputStream bufferOut = new BufferedOutputStream(
								fout, buffer.length);
						while ((size = zin.read(buffer, 0, buffer.length)) != -1) {
							bufferOut.write(buffer, 0, size);	
						}
						bufferOut.flush();
						bufferOut.close();
						fout.close();
						zin.closeEntry();
						publishProgress(currentSize,totalSize);
					}
				}
			} finally {
				zin.close();
				fis.close();	
			}
		} catch (Exception e) {
			Log.e("пост", "Unzip exception", e);
		}
		return null;
	}


Вот эта вещь byte[2048] сильно влияет на производительность?
Что будет если её поменять на 4048 ?
...
Рейтинг: 0 / 0
26.06.2014, 13:50
    #38680809
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора тормозит
[quot petrovichtim]
Код: java
1.
2.
3.
4.
5.
						BufferedOutputStream bufferOut = new BufferedOutputStream(
								fout, buffer.length);
						while ((size = zin.read(buffer, 0, buffer.length)) != -1) {
							bufferOut.write(buffer, 0, size);	
						}


[quot]
Это facepalm. BufferedOutputStream уже реализует запись через byte[], которую вы реализовали самостоятельно.
Почему было не воткнуть ещё BufferedInputStream - для меня остаётся загадкой.
...
Рейтинг: 0 / 0
26.06.2014, 13:52
    #38680810
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора тормозит
petrovichtimВот эта вещь byte[2048] сильно влияет на производительность?
Что будет если её поменять на 4048 ?
Зависит от файловой системы. В теории, скорость копирования может немного увеличится.
...
Рейтинг: 0 / 0
26.06.2014, 14:51
    #38680901
petrovichtim
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора тормозит
BufferedOutputStream
По умолчанию пишет в 8192 как я понимаю?
...
Рейтинг: 0 / 0
26.06.2014, 15:06
    #38680926
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора тормозит
petrovichtim BufferedOutputStream
По умолчанию пишет в 8192 как я понимаю?
Да. В доке так написано.
...
Рейтинг: 0 / 0
26.06.2014, 19:44
    #38681232
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора тормозит
BlazkowiczСвой буфер аналогично.
http://developer.android.com/reference/java/io/BufferedOutputStream.html Толку-то? Ну заполнил рантайм этот буфер одним вызовом - в коде всё равно извлекается его содержимое по одному байту.Сотню тактов процессора, разве что, можно сэкономить.Это дисковых обращений не экономится, а процессор - ещё как.
...
Рейтинг: 0 / 0
26.06.2014, 19:54
    #38681240
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора тормозит
Basil A. SidorovЭто дисковых обращений не экономится, а процессор - ещё как.
На фоне разницы в IO, можно сказать что никак не экономится. Даже Unzip обходится на несколько порядков дороже, чем такая оптимизация.
...
Рейтинг: 0 / 0
26.06.2014, 20:09
    #38681243
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора тормозит
BlazkowiczНа фоне разницы в IO, можно сказать что никак не экономится. Даже Unzip обходится на несколько порядков дороже, чем такая оптимизация.
В, принципе, для 130Мб, 5-10 секунд можно поиметь. Но боюсь себе представить сколько на мобилке будут эти 130Мб распаковываться.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Сборщик мусора тормозит / 25 сообщений из 59, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]