I`m using RadPdfViewer to show user a pdf files from my database (files stores at database by Filestream).
<
telerik:RadPdfViewer
x:Name
=
"PdfViewer"
Grid.Column
=
"1"
></
telerik:RadPdfViewer
>
I`m loading files by Uri, here is my code:
private
void
BrowseDocumentOnClick(
object
sender, RadRoutedEventArgs e)
{
//check if user have select document from tableview
if
(_viewModel.SelectedEntity ==
null
)
return
;
//form uri query to server. Inserting document identifier
var uri =
new
Uri(String.Format(
"/Files/FileView.aspx?docId={0}"
, _viewModel.SelectedEntity.pk_documentid),
UriKind.Relative);
//start loading file by chunks from server
this
.PdfViewer.DocumentSource =
new
PdfDocumentSource(uri);
}
The problem is that when I`m trying to sequentially see several different documents by one instance of RadPdfViewer - the old documents are not removed from memory. And I`dont find any method at "this.pdfViewer" which could clean the memory from old documents.
5 Answers, 1 is accepted
Can you clarify in what way you understand that documents are not removed from the memory? Maybe send us a demo project that will reproduce this issue in a support ticket?
We have tested RadPdfViewer and in our test project, the documents were released correctly.
Looking forward to your answer.
Regards,
Kammen
the Telerik team
Explore the entire Telerik portfolio by downloading Telerik DevCraft Ultimate.
1. After solution run (two projects:asp.net, silverlight app) Instance of IE 9 at task manager shows 60-62 mb of memory usage.
2. When I download a first pdf from a server side to telerik pdf control, the memory usage increase to nearly 70-75 mb ( exact size of upload file - 1 mb).
3. When I download another pdf file from server, the memory usage increases up to 200 mb. (though pdf file size is about 2 mb). (It`s consist of images inserted inside a pdf file)
I`ve attached 3 pics which show memory usage.
1. 0 pdf files download from server
2. 1 pdf files download from server
3. 2 pdf files download from server
The code of server side which sends file in chunks by bytes. (Code of client side I published in my first post. )
using
System;
using
System.IO;
using
System.Linq;
namespace
ATZO.Web.Files
{
public
partial
class
FileView : System.Web.UI.Page
{
protected
void
Page_Load(
object
sender, EventArgs e)
{
var doc = Page.Request.QueryString[
"docId"
];
// some check logic
if
(doc ==
null
)
{
}
var DocumentId=
long
.Parse(doc);
Response.ContentType =
"application/pdf"
;
Response.AddHeader(
"Pragma"
,
"no-cache"
);
var doc =
new
document();
//get document from database
using
(var dbConnect=
new
DBConnect())
{
doc= dbConnect.reg_document.SingleOrDefault(_=> _.DocId == DocumentId);
}
int
BufferSize = 8000;
var fileBytes = doc.fileDATA;
try
{
long
fileSize = fileBytes.Length;
int
chunkLength = 0;
int
position = 0;
var chunk =
new
Byte[BufferSize];
//count of bytes left to transmit
var bytesLeftToTransmit = fileSize;
while
(bytesLeftToTransmit > 0)
{
chunkLength = fileBytes.Skip(position).Take(BufferSize).Count();
chunk = fileBytes.Skip(position).Take(chunkLength).ToArray();
Response.OutputStream.Write(chunk, 0, chunkLength);
Response.Flush();
position += chunkLength;
bytesLeftToTransmit -= chunkLength;
}
}
finally
{
Response.End();
}
Response.End();
}
}
}
As we mentioned before, we have tested this scenario with a profiler and the results are that all documents are removed as soon as the garbage collector collects them. The memory usage is increased because of the UI virtualization that RadPdfViewer implements. We do not release the created UI elements, but we store them in a factory so they can be used later. This behavior is due to performance reasons and we do not plan to change it for the moment.
Also, it is normal that RadPdfViewer uses more memory than the PDF document's size, because additional preprocessing is done, document elements are created and so on.
Hope this answers your question.
Regards,
Kammen
the Telerik team
Explore the entire Telerik portfolio by downloading Telerik DevCraft Ultimate.
thank you for your reply.
My anxiety was associated with a dramatic increase in memory usage.
From 60 mb to 200-250 mb by showing a client a few pdf files (2-4).
Regards,
Ars Stepanov
Hi Ars,
I'm with you- i have an app that shows users PDF files, and a 6MB pdf turns into 400MB+ in memory.
i find that if you dispose the pdf viewer after it closes it still remains in memory- until you create a new pdfViewer object then the memory usage drops back to normal.
So what i do now, is when i want to view a PDF, i create a new tab (with option: CloseAction = DockWindowCloseAction.CloseAndDispose) and with that tab, a new RadPdfViewer & RadPdfViewerNavigator. it seems when you create another pdfviewer object the previous one gets removed from memory- does not matter if the tab is disposed, or you can force a GC(not recommended) but the code is below.
Note: if you are going to run your app in a shared environment like a Terminal Server and call the GC collects, the runtime options in your App.Config should reference the <gcServer> and <gcConcurrent> options and be set to TRUE. It goes without saying: Use at your own risk and always test prior to deployment...
Dim
CurProc
As
Process = Process.GetCurrentProcess()
'If the Process has gone over 500MB
If
FormatNumber(
CDbl
(((c.WorkingSet64 / 1024) / 1024)), 2) > 500.0
Then
Try
GC.Collect()
GC.WaitForPendingFinalizers()
Catch
ex
As
Exception
'Do something with our error here.
End
Try
Else
'Still within our operating limitations.
End
If
'Cleanup
CurProc =
Nothing