Hello,
I get error “Out of memory” when I try to send binary data by RemObjects.
My system’s parameters:
Windows 7 64bit
RAM 3 Gb
Delphi XE5
Rem Objects SDK 7.0.75.1117
My application is run as NT service (by Administrator). I try to send binary data by SOAP on the method:
function TSession.GetItemDataByDoc(const DocNo: Integer; out ItemInfo: TStructItemInfo): Integer;
begin
ItemInfo := TStructItemInfo.Create;
ItemInfo.ItemData := Binary.Create;
ItemInfo.ItemData.Position := 0;
ItemInfo.ItemData.LoadFromFile(Format(‘C:\tmp%d.rar’, [DocNo]));
end;
TStructItemInfo = class(TROComplexType)
…
fItemTitle: UnicodeString;
fItemType: UnicodeString;
fItemData: Binary;
fSystemName: UnicodeString;
…
code of DFM:
object ROServer: TROIndyHTTPServer
Dispatchers = <
item
Name = ‘ROMessage’
Message = ROMessage
Enabled = True
PathInfo = ‘SOAP’
end>
OnReadFromStream = ROServerReadFromStream
SendClientAccessPolicyXml = captAllowAll
IndyServer.Bindings = <>
IndyServer.DefaultPort = 8095
Port = 8095
….
end
object ROMessage: TROSOAPMessage
Envelopes = <>
SerializationOptions = [xsoWriteMultiRefArray, xsoWriteMultiRefObject]
….
end
object SessionManager: TROInMemorySessionManager
MaxSessions = 500
OnBeforeDeleteSession = SessionManagerBeforeDeleteSession
……
end
And I try to get this data on client side (ASP classic, VB script).
If I try to send file more than 100-150 Mb – My application use very large size of memory. For example:
File size – 190 Mb → used memory 1120 Mb, File size – 280 Mb → used memory 2200 Mb.
And if I try to send file more - I get the error “Out of memory”. This exception occurs in the RO internal method:
procedure TSession_Invoker.Invoke_GetItemDataByDoc(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
{ function GetItemDataByDoc(const DocNo: Integer; out ItemInfo: TStructItemInfo): Integer; }
var
DocNo: Integer;
ItemInfo: VEntWebLib_Intf.TStructItemInfo;
lResult: Integer;
__lObjectDisposer: TROObjectDisposer;
begin
CheckRoles(__Instance, GetDefaultServiceRoles);
ItemInfo := nil;
try
__Message.Read(‘DocNo’, TypeInfo(Integer), DocNo, );
lResult := (__Instance as ISession).GetItemDataByDoc(DocNo, ItemInfo);
__Message.InitializeResponseMessage(__Transport, 'VEntWebLib', 'Session', 'GetItemDataByDocResponse'); __Message.Write('Result', TypeInfo(Integer), lResult, []);
// Exception this! ----------------------
__Message.Write(‘ItemInfo’, TypeInfo(VEntWebLib_Intf.TStructItemInfo), ItemInfo, []);
// -------------------------------------------
__Message.Finalize;
__Message.UnsetAttributes(__Transport);
finally
__lObjectDisposer := TROObjectDisposer.Create(__Instance);
try
__lObjectDisposer.Add(ItemInfo);
finally
__lObjectDisposer.Free();
end;
end;
end;
I use FastMM4 {$SetPEFlags $20} in my project but it don’t help.
I tried to use last version of RemObjects SDK (v. 9 - trial), but I still got the error.
- Can you help me to fix this error?
- What the maximal size for sending binary data in RemObjects?
- How do the size depends on the system parameters (32 or 64, RAM, ext.)?