场景:我们正在尝试从我们的网站下载 2500 个 PDF,我们需要找到该场景与应用程序的其他业务流程一起运行时的响应时间。我编写的用于动态选择和下载 PDF 的自定义代码在 vugen 甚至 Controller 上都可以很好地处理 200-300 个 PDF 的大小。但是,当我们运行相同的脚本并将 2500 个 PDF 加载到数据库时,该脚本在 vugen 上运行良好,但在 Controller 上出现内存不足的情况。我尝试在 Controller 上为并发用户 (20) 单独运行此脚本,但即使如此,它也失败并给出相同的内存不足错误。一旦并发用户开始在服务器上运行,我就开始收到此错误。
我尝试了以下事情和我的观察:
1.我检查了我们正在使用的 LG,在出现此内存错误时没有出现过高的 cpu 使用率/内存使用率。
2.我尝试完全关闭日志记录,并关闭“生成错误快照”。
3.我将网络缓冲区大小从默认的 12KB 增加到大约 2MB 的更高值,因为服务器以该 PDF 大小进行响应。
4.另外,将 JavaScript 运行时内存值增加到更高的值,但我知道这与代码有关。
5.我设置了 web_set_max_html_param_len("100000");
这是我的代码:
int download_size,i,m;
m=atoi(lr_eval_string("{DownloadableRecords_FundingNotices_count}"));
for(i=1;i<=m;i++)
lr_param_sprintf("r_buf","%sselectedNotice=%s&",lr_eval_string("{r_buf}"),lr_paramarr_idx("DownloadableRecords_FundingNotices",i));
lr_save_string(lr_eval_string("{r_buf}"), "dpAllRecords");
我无法找到我的代码的问题,因为它在 vugen 中运行良好。
有一件事是:它创建了巨大的 mdrv.log 文件来容纳格式如上所示的所有 2500 名成员(member)
“%sselectedNotice=%s&”
。
我需要这方面的帮助。
好吧,由于这不起作用并且我找不到根本原因,我尝试使用字符串缓冲区修改代码以保存值而不是参数。这次我的代码无法正常工作,并且无法获得正确格式的值,导致我的 web_custom_request 失败
所以,这是 sprintf 的代码
char *r_buf=(char *) malloc(55000);
int download_size,i,m;
m=atoi(lr_eval_string("{DownloadableRecords_FundingNotices_count}"));
for(i=1;i<=m;i++)
sprintf(r_buf,"%sselectedNotice=%s&",r_buf,lr_paramarr_idx ("DownloadableRecords_FundingNotices",i));
lr_save_string(r_buf, "dpAllRecords");
我也尝试过使用这个:
lr_save_string(lr_eval_string("{r_buf}"), "dpAllRecords");
虽然是为了嵌入参数但是徒劳
最佳答案
你可以尝试下面的方法。如果释放分配的内存,您在示例中不会执行此操作。
我改变了:
- r_buf 的分配方式
- 如何填充 r_buf(在缓冲区中执行 sprintf() 以及从缓冲区中执行 sprintf() 可能无法按预期工作)
- 使用 lr_paramarr_len()
- 释放分配的缓冲区!
- 检查循环中分配的缓冲区是否足够大
Action() 代码:
char *r_buf;
char buf[2048];
int download_size,i,m;
// Allocate memory
if ( (r_buf= (char *)calloc(65535 * sizeof(char))) == NULL)
{
lr_error_message ("Insufficient memory available");
return -1;
}
memset( buf, 0, sizeof(buf) );
m = lr_paramarr_len("DownloadableRecords_FundingNotices");
for(i=1; i<=m; i++) {
sprintf( buf, "selectedNotice=%s&", lr_paramarr_idx("DownloadableRecords_FundingNotices",i) );
// Check buffer is big enough to hold the new data
if ( strlen(r_buf)+strlen(buf) > 65535 ) {
lr_error_message("Buffer exceeded");
lr_abort();
}
// Concatenate to final buffer
strcat( r_buf, buf ); // Bugfix: This was "strcat( r_buf, "%s", buf );"
}
// Save buffer to variable
lr_save_string(r_buf, "dpAllRecords");
// Free memory
free( r_buf );
关于c - LR Controller 上的 "Error -- memory violation : Exception ACCESS_VIOLATION received",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31793477/