【终极性能优化版】java万能执行python方法生成机器学习模型并应用机器学习模型

大家都知道,两年前我发表了一篇java万能调用python机器学习模型的文章,得到了很多网友的受用。在快速的大数据环境下,毫秒级响应成为大家关注的焦点,之前的方法当python程序涉及导入包比较多时,多上百万线程方式过来的每条数据在调用python时就会变得特别慢,最慢达到了5秒才执行完,这对很多系统有非常大的延迟,很多公司选用阿里的flink框架,今天小順在这里介绍一种非常简单的常规方式,同样可以达到毫秒级响应。我是小順,请大家关注我,我会给大家发更多的工具。
在这里插入图片描述
本文的例子是dga域名检测的机器学习模型的调用

JavaExecPythonMLModel.java


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Properties;

public class JavaExecPythonMLModel {
    
   try {
			String ip = "192.168.1.3";
			int port = 50007;
			Socket client = new Socket(ip, port);
			OutputStreamWriter os = new OutputStreamWriter(client.getOutputStream());
			StringBuilder sb = new StringBuilder();
			sb.append("baidu.com").append("\r\n");
			os.write(sb.toString());
			os.flush();

			InputStream is = client.getInputStream();
			byte[] buf = new byte[1024 * 8];
			StringBuilder msg = new StringBuilder();
			for (int len = is.read(buf); len > 0; len = is.read(buf)) {
			    msg.append(new String(buf, 0, len));
			}
			client.shutdownInput();
			System.out.println("正在接收回复信息...");
			System.out.println("服务器返回的信息: " + msg);
			System.out.println("接收回复信息完成");
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
}

dga_server.py

import pandas as pd
import pickle
from DGA_CHECK_MODEL import dgaCheck # 这个属于知识产权保护范畴,不能公开,是自己做的模型python程序,各位小伙伴替换自己的方法即可

#导入训练的好的模型      
with open('./DGA_SVM.pkl', 'rb') as f:
        clf = pickle.load(f)
            
import socket
HOST = '192.168.1.3'
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST,PORT))
while True:
    try:
        s.listen()
        conn,addr = s.accept()
        data = conn.recv(1024)
        data = bytes.decode(data)
        data = data.replace("\\r\\n","")
        result = dgaCheck(data.split(','), clf)
        conn.sendall(str.encode(str(result)))     
        conn.close()    
    except Exception:
        pass

运行原理:
1 首先运行python dga_server.py , 即socket服务端,就是将所有消耗时间的导入包、导入模型等统统准备好。

2 然后再通过java 的socket客户端 调用服务端,毫秒级响应就返回了想要的结果。

测试时我写了个测试jar包,用拥有20个线程的线程池,去消费1000000个线程,观察每个线程的消耗时间,截取其中一段,如图
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值