首页 > 解决方案 > 保存许多变量的 Jmeter Beanshell 采样器的内存限制

问题描述

我有一个 450K 行和 2 列的 csv 文件。使用 CSV 数据配置会导致SocketException: Too many open files某些负载生成器出错。为了解决这个问题,我使用 Beanshell 采样器仅读取内存中大型 csv 的内容一次,但是当它尝试保存变量 # 22,770 时,它会抛出java.lang.ArrayIndexOutOfBoundsException: null 以下是我的简单代码 -

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.lang.*;

BufferedReader lineReader = null;
try{
    lineReader= new BufferedReader(new FileReader("${skufile}"));
    String line = null;
    int count = 0;
    while ((line = lineReader.readLine()) != null){
        String[] values = line.split(",");
        vars.put("sku_" + count, values[0]);
        vars.put("optionid_" + count, values[1]);
        log.info("Sku# "+ count + " : " +vars.get("sku_"+count));
        count++;
    }
   }catch (Throwable e) {
    log.error("Errror in Beanshell", e);
    throw e;
    }

我尝试过同时使用道具和变量。

标签: jmeterbeanshell

解决方案


  1. 该错误与任何形式的限制无关,请查看 CSV 文件的第 22771 行,它可能不包含逗号,因此您的values[1]变为null
  2. 将文件保存在内存中并不是最好的选择,我宁愿推荐使用 CSV 数据集配置并增加打开文件的最大数量,1024这对于大多数 Linux 发行版的普通用户来说可能一样低。步骤是:

    • 将下一行添加到/etc/security/limits.conf文件

      your_user_name soft nofile 4096
      your_user_name hard nofile 65536
      
    • 您还可以运行以下命令来提高系统范围的“硬”限制

      ulimit -n 8192
      
  3. 请注意,从 JMeter 3.1 开始,建议使用 JSR223 测试元素和 Groovy 语言编写脚本。Groovy 不仅兼容最新的 Java 语言特性,而且在顶部提供语法糖,与 Beanshell 相比,Groovy 具有更好的性能


推荐阅读