powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Сборщик мусора тормозит
25 сообщений из 59, страница 1 из 3
Сборщик мусора тормозит
    #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
Сборщик мусора тормозит
    #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
Сборщик мусора тормозит
    #38680358
petrovichtim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
оно ?
Код: java
1.
fout.flus();
...
Рейтинг: 0 / 0
Сборщик мусора тормозит
    #38680362
Фотография buldozer01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
)) попробуйте
...
Рейтинг: 0 / 0
Сборщик мусора тормозит
    #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
Сборщик мусора тормозит
    #38680375
petrovichtim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно close должнен вызывать flush но не у всех потоков.
Посмотрел чужие примеры, везде ставят flush
...
Рейтинг: 0 / 0
Сборщик мусора тормозит
    #38680492
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrovichtimЕсть архив с примерно 5000 файлов размером 130 мегабайт.
Форменное издевательство над андроидом... Это не основном потоке, надеюсь, делается?
...
Рейтинг: 0 / 0
Сборщик мусора тормозит
    #38680527
petrovichtim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,
Само собой
...
Рейтинг: 0 / 0
Сборщик мусора тормозит
    #38680543
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrovichtimВот код его распаковки

BufferedOutputStream и BufferedInputStream не пробовали добавить?
...
Рейтинг: 0 / 0
Сборщик мусора тормозит
    #38680545
petrovichtim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так ругается консолька
авторGC_CONCURRENT freed 1170K, 20% free 7646K/9479K, paused 1ms+2ms
...
Рейтинг: 0 / 0
Сборщик мусора тормозит
    #38680547
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот это странный код.
Код: java
1.
2.
3.
if(!unzipFile.isDirectory()) {
    unzipFile.mkdirs();
}
...
Рейтинг: 0 / 0
Сборщик мусора тормозит
    #38680556
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо бы попрофилировать. Потому что код, в целом, если не считать отсутствие буфера, нормальный.
https://developer.android.com/tools/debugging/debugging-memory.html
...
Рейтинг: 0 / 0
Сборщик мусора тормозит
    #38680560
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrovichtimwadman,
Само собой
Тогда наверное стоит вставить какую-нибудь малозначительную паузу между файлами?
...
Рейтинг: 0 / 0
Сборщик мусора тормозит
    #38680572
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanТогда наверное стоит вставить какую-нибудь малозначительную паузу между файлами?
Интересный совет. Действительно, если распаковка занимает большое количество времени CPU, то GC может просто не успеть расшириться\отработать. С другой стороны должны быть большие простои на IO. Которые должны заменить эти паузы.
...
Рейтинг: 0 / 0
Сборщик мусора тормозит
    #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
Сборщик мусора тормозит
    #38680662
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только неравенство должно быть нестрогое.
...
Рейтинг: 0 / 0
Сборщик мусора тормозит
    #38680663
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovПобайтовая перекачка данных - не лучшее решение:
Код: sql
1.
byte[] buffer = new byte[4*1024];


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


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