powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Комрады подскажите сo space() plz.
4 сообщений из 4, страница 1 из 1
Комрады подскажите сo space() plz.
    #38412416
Фотография voronk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго всем времени суток.

PB 12.1
mssql 2005

читаю фото в блоб
затем используя CryptBinaryToString отправляю его дальше вэб-сервису

с мелкими файлами всё пучком

с крупными, вот например 2.13Мега, выбрасывает на строке: s_base64Binary = Space(ul_buflen), где ul_buflen = 309120000, недостаток памяти

Как боротса?

Код вкрадце, где bl_tot - прочитанный файл:

ul_len = Len(bl_tot)
ul_buflen = ul_len * 2

s_base64Binary = Space(ul_buflen) // Вот тут и рушитса (ul_buflen = 309120000)

IF NOT CryptBinaryToString(bl_tot, ul_len, CRYPT_STRING_BASE64, s_base64Binary, ul_buflen) then
s_base64Binary = ''
ELSE // remove the last two chr(0)!
s_base64Binary = left(s_base64Binary, len(s_base64Binary) - 2 )
END IF

Буду премного благодарен.

http://msdn.microsoft.com/en-us/library/windows/desktop/aa379887(v=vs.85).aspx
...
Рейтинг: 0 / 0
Комрады подскажите сo space() plz.
    #38412584
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так действительно может памяти не хватает?
PageFile на машине у себя увеличить надо. И, может быть, не стоит через веб-сервис такие объемы гонять?
...
Рейтинг: 0 / 0
Комрады подскажите сo space() plz.
    #38412833
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
voronkPB 12.1
voronkul_len = Len(bl_tot)
ul_buflen = ul_len * 2

s_base64Binary = Space(ul_buflen) // Вот тут и рушитса (ul_buflen = 309120000)
1. В ПБ12 строки занимают 2 байта на символ, поэтому space(X) выделяет X*2 байтов.
2. Исходя из п.1 вообще непонятно зачем вы выделяете 2х символов - это ж в итоге в 4 раза больше байтов выделится
3. Если выделить в space 300М символов, то выделится 600М байтов. Для 32 битного приложения, коим является ПБ, очень высока вероятность что из-за фрагментации просто не такого непрерывного куска памяти.

Таким образом вам надо
1. Разобраться с логикой символы-байты
2. Переделать алгоритм чтобы не допускать выделения больших кусков памяти (напр. работать поблочно)
...
Рейтинг: 0 / 0
Комрады подскажите сo space() plz.
    #38413589
Фотография voronk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ребята спасибо всем кто поучаствовал ... разобрался ... это я профунькал ... не делал ресет временного блоба когда читал файл, в результате размеры тотал блоба не лезли ни в какие ворота:

узнаём размер:
l_flen = FileLength(s_file_name)

открываем файл:
i_fnum = FileOpen(s_file_name, StreamMode!, Read!, LockRead!)

определяем количество лупов для его читания:
IF l_flen > 32765 THEN
IF Mod(l_flen, 32765) = 0 THEN
i_loops = l_flen/32765
ELSE
i_loops = (l_flen/32765) + 1
END IF
ELSE
i_loops = 1
END IF

в мелких файлах хватало одного лупа, поехтому код внизу работал без проблем:

bl_pdf = bl_null
bl_tot = bl_null

FOR i_rc = 1 to i_loops
l_bytes_read = FileReadEx(i_fnum, bl_pdf)
bl_tot = bl_tot + bl_pdf
bl_pdf = bl_null // ->>>>>>>>>>>>>>>>>>>>> вот этот ресет я и забыл прописать ..........
NEXT

FileClose(i_fnum)

ul_len = Len(bl_tot)
ul_buflen = ul_len * 2 // поэтому без него ul_buflen и становился гигантским и

и - s_base64Binary = Space(ul_buflen) вылетала с криками о недостатке памяти.

Вообщем ешё раз: Война окончена, всем спасибо(с)
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Комрады подскажите сo space() plz.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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