powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / QuickLZ OutofMemory:Java heap space
12 сообщений из 12, страница 1 из 1
QuickLZ OutofMemory:Java heap space
    #38923804
Philip_Stubborn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
В БД лежат двоичные данные bytea - заархивированные (qlz)
Для разархивирования использую QuickLZ.decompress(data)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 String query = "select _id, _data from db_ipr.screenshots where _time between '2014-08-26 16:29:26' and " +
                " '2014-08-26 16:30:00' and _type = 1" ;
        try {
            PreparedStatement st = conn.prepareStatement(query);
            ResultSet rs = st.executeQuery();
            while (rs.next())
            {
                ArchImages images = new ArchImages ();
                images.setId(rs.getInt("_id"));
                images.setData(rs.getBytes("_data"));



Передаю bytea column value в функцию (images.getData()):

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
private byte[] UnPackArchivedData(byte[] aData, int aArchvedData)
    {

       final int QLZ_ARCHIVER_TYPE = 2;

        switch (aArchvedData)
        {

            case QLZ_ARCHIVER_TYPE:
                return QuickLZ.decompress(aData);
            default:
                System.out.append("Wrong ArchiverType value (" + aArchvedData + ")");
                return null;
        }
    }



Но у меня выходит ошибка в самой библиотеке QuickLZ.java
Код: java
1.
2.
3.
4.
5.
6.
7.
 static public byte[] decompress(byte[] source)
    {
        int size = (int)sizeDecompressed(source);
        int src = headerLen(source);
        int dst = 0;
        long cword_val = 1;
        byte[] destination = new byte[size];



На
Код: java
1.
 byte[] destination = new byte[size]
...
Рейтинг: 0 / 0
QuickLZ OutofMemory:Java heap space
    #38923810
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сколько у вас записей возвращает SELECT запрос и какой суммарный размер файлов (bytea) у этих записей? А в распакованном виде? Сколько нужно памяти чтобы это всё там держать?
Зачем вы используете какую-то странную поделку для компрессии?

Philip_Stubborn Но у меня выходит ошибка в самой библиотеке QuickLZ.java
OutofMemory:Java heap space это нехватка памяти выделенной JVM. То откуда было выброшено исключение очень слабо связано с действительной причиной нехватки памяти.
...
Рейтинг: 0 / 0
QuickLZ OutofMemory:Java heap space
    #38923824
Philip_Stubborn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
select возвращает 3 записи,
max размер задается в бд в колонке _size = 1311798 (в распакованном виде)
aData.length = 141748
...
Рейтинг: 0 / 0
QuickLZ OutofMemory:Java heap space
    #38923828
Philip_Stubborn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы сказали, что я использую странный способ архивации.
Но у меня уже готовые данные в бд лежат, и с ними работаю.
...
Рейтинг: 0 / 0
QuickLZ OutofMemory:Java heap space
    #38923854
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Philip_Stubborn,

Тогда странно. Дефолтной кучи вполне должно хватать для таких объемов. Это серверное приложение? Вы ResultSet, PreparedStatement точно закрываете? try with resource почему не используете?
...
Рейтинг: 0 / 0
QuickLZ OutofMemory:Java heap space
    #38923857
Philip_Stubborn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
 static public byte[] decompress(byte[] source)
    {
        int size = (int)sizeDecompressed(source);



В QuickLZ.java вызывается эта функция

Код: java
1.
2.
3.
4.
5.
6.
7.
static public long sizeDecompressed(byte[] source)
    {
        if (headerLen(source) == 9)
            return fast_read(source, 5, 4);
        else
            return fast_read(source, 2, 1);
    }



Затем из нее
Код: java
1.
2.
3.
4.
 static int headerLen(byte[] source)
    {
        return ((source[0] & 2) == 2) ? 9 : 3;
    }




и эта return fast_read(source, 5, 4);

Код: java
1.
2.
3.
4.
5.
6.
7.
 static long fast_read(byte[] a, int i, int numbytes)
    {
        long l = 0;
        for (int j = 0; j < numbytes; j++)
            l |= ((((int)a[i + j]) & 0xffL) << j * 8);
        return l;
    }



Потом при byte[] destination = new byte[size]

в

Код: java
1.
2.
3.
4.
5.
6.
7.
 static public byte[] decompress(byte[] source)
    {
        int size = (int)sizeDecompressed(source);
        int src = headerLen(source);
        int dst = 0;
        long cword_val = 1;
        byte[] destination = new byte[size];



и выдается ошибка
...
Рейтинг: 0 / 0
QuickLZ OutofMemory:Java heap space
    #38923862
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Philip_StubbornПотом при byte[] destination = new byte[size]
и выдается ошибка
Потому что у вас вся память уже чем-то забита, вот Java и не шмогла выдать ещё пару мегабайт под массив. size хоть какой в этом месте посмотрели?
...
Рейтинг: 0 / 0
QuickLZ OutofMemory:Java heap space
    #38923863
Philip_Stubborn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Код: 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.
 @Transactional
    public List<InfoPerimetr> eventsScreenshots(Connection conn, long agentId) {
        List<InfoPerimetr> result = new ArrayList<InfoPerimetr>();
        String query = "select _id, _data from db_ipr.screenshots where _time between '2014-08-26 16:29:26' and " +
                " '2014-08-26 16:30:00' and _type = 1" ;
        try {
            PreparedStatement st = conn.prepareStatement(query);
            ResultSet rs = st.executeQuery();
            while (rs.next())
            {
               InfoPerimetr  ipr = new InfoPerimetr();
                ipr.setId(rs.getInt("_id"));
                ipr.setData(rs.getBytes("_data"));

                String path = "";
                path = fileAttachOpen(ipr.getData(), "Screenshot.bmp");

                ipr.setPath(path);
                ipr.setName("Screenshot.bmp");

                result.add(ipr);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return result;
    }
...
Рейтинг: 0 / 0
QuickLZ OutofMemory:Java heap space
    #38923865
Philip_Stubborn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
Да, конечно, очень большой - 808464688
...
Рейтинг: 0 / 0
QuickLZ OutofMemory:Java heap space
    #38923890
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Philip_Stubborn
Код: java
1.
2.
3.
4.
5.
6.
        try {
            PreparedStatement st = conn.prepareStatement(query);
            ResultSet rs = st.executeQuery();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }


За такое джуниорам серьзный втык делают. А вы же вроде не первый год на форуме.

Philip_StubbornДа, конечно, очень большой - 808464688
Значит что-то не так с денными.
Возможно они запакованы другой версией QuickLZ ?
Возможно это какая-то специфика типа bytea, в котором ещё лишние байты в заголовке нарисовались?
...
Рейтинг: 0 / 0
QuickLZ OutofMemory:Java heap space
    #38923907
Philip_Stubborn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
Сорри (
...
Рейтинг: 0 / 0
QuickLZ OutofMemory:Java heap space
    #38923981
Philip_Stubborn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
Да, Вы были правы, данные в бд легли неправильно, они вдвое и втрое увеличенном размере клались (перенос bytea из postgres 8.4
в 9.3)
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / QuickLZ OutofMemory:Java heap space
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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