|
Комрады подскажите сo space() plz.
|
|||
---|---|---|---|
#18+
Доброго всем времени суток. 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 23:03 |
|
Комрады подскажите сo space() plz.
|
|||
---|---|---|---|
#18+
Ну так действительно может памяти не хватает? PageFile на машине у себя увеличить надо. И, может быть, не стоит через веб-сервис такие объемы гонять? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2013, 09:39 |
|
Комрады подскажите сo space() plz.
|
|||
---|---|---|---|
#18+
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. Переделать алгоритм чтобы не допускать выделения больших кусков памяти (напр. работать поблочно) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2013, 12:09 |
|
Комрады подскажите сo space() plz.
|
|||
---|---|---|---|
#18+
ребята спасибо всем кто поучаствовал ... разобрался ... это я профунькал ... не делал ресет временного блоба когда читал файл, в результате размеры тотал блоба не лезли ни в какие ворота: узнаём размер: 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) вылетала с криками о недостатке памяти. Вообщем ешё раз: Война окончена, всем спасибо(с) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2013, 20:25 |
|
|
start [/forum/topic.php?fid=15&gotonew=1&tid=1335388]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
342ms |
get topic data: |
13ms |
get first new msg: |
8ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 465ms |
0 / 0 |