搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
小蓝xlanll
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
图解剖析,递归思想,使用二叉链建立一个二叉树并实现相关操作(数据结构)_用二叉链表建立二叉树
2
使用docker、docker-compose部署微服务_docker部署微服务项目
3
WebSocket使用(C++环境)(一) --- websocket++库的安装与使用_c++ websocket库
4
Android Studio 所有历史版本下载_android studio旧版本怎么下载
5
vue3树状图,树状关系图_vue3绘制树状图
6
OpenCV 验证码图像增强处理 一、滤波增强_opencv 边缘增强
7
js 通用防重复提交方法_js防止表单重复提交
8
T113-S3-RTL8211网口phy芯片调试
9
igraph入门教程
10
微信小程序中使用uniCloud_微信小程序unicloud
当前位置:
article
> 正文
数据量大时将数据存到内存中然后启动一个线程从内存中读取数据_一个线程保存数据,一个线程读取数据
作者:小蓝xlanll | 2024-03-19 14:12:17
赞
踩
一个线程保存数据,一个线程读取数据
如果遇到程序中的数据量大时,可以通过以下方法将其进行处理。
方法如下:
1 将得到的数据添加到内存中
2 启动一个线程(一直循环,不断的去扫描),专门读取内存的数据。
3 得到内存中的数据,进行下一步的操作(如添加到redis中或批量操作插入到数据库中)。
示例:
1 通过webservice时或者程序订阅每时每刻都会有大量的数据得到。
2 为了将数据保存到内存中。定义一个线程安全的类(单例模式+虚拟锁),类中定义一个list用来存取数据。
3 当程序中得到数据时,保存到该类的list中(通过虚拟锁达到线程安全)。
4 启动一个子线程(一直循环,不断的去扫描),专门去读取该类的list数据(每次读取1000条,可配置,读取list的方法也是通过虚拟锁达到线程安全)。
5 通过子线程得到了分批次的数据后。可以进行后续操作。如添加到redis中或批量操作插入到数据库中。
具体例子:
1 新建一个类,用来保存数据,将数据保存到内存中。
如:
public class AisHistoryServiceFactory {
public static AisHistoryServiceFactory instance = null;
private static final Object uniqueLock = new Object();
private static final Object objectLock = new Object();
private List<AisInfo> aisInfoList = new ArrayList<AisInfo>();
public static boolean flag_insert_hbase=false;//是否容许插入到hbase中
public static AisHistoryServiceFactory getInstance() {
if (null == instance) {
synchronized (uniqueLock) {
if (null == instance) {
instance = new AisHistoryServiceFactory();
}
}
}
return instance;
}
public boolean addAisInfo(AisInfo info) {
synchronized (objectLock) {
if (isFull()) {
return false; // 内存list满,
}
//不需要解密
AisInfo in = info;//getFromBase64(info);
if (isNeedInfo(in)) {
if (null == aisInfoList) {
aisInfoList = new ArrayList<AisInfo>();
}
if (!aisInfoList.contains(in)) {
aisInfoList.add(0, in);
}
}
return true;
}
}
public boolean getAisInfo(List<AisInfo> list, int size) {
synchronized (objectLock) {
// System.out.println("==== Get Info Size : " + size + " ====");
// System.out.println("==== Info List Size Before Get : " + aisInfoList.size() + "====");
int countNum = 0;
if(null != aisInfoList && aisInfoList.size() > 0){
for (int i = aisInfoList.size() - 1; i >= 0; i--) {
AisInfo temp = aisInfoList.remove(i);
list.add(temp);
countNum++ ;
if(countNum >= size){
// System.out.println("==== Info List Size After Get 1 : " + aisInfoList.size() + "====");
return true;
}
if(aisInfoList.size() <= 0){
// System.out.println("==== Info List Size After Get 2 : " + aisInfoList.size() + "====");
return true;
}
}
}
return false;
}
}
private boolean isNeedInfo(AisInfo info) {
return true;
}
private boolean isFull() {
synchronized (objectLock) {
int maxSize = SystemConfigFactory.getInstance().getSystemConfigInt(ConfigMacroDef.AIS_INFO_MAX_SIZE_WAN, 100); // 保存多少条AIS数据,
maxSize = maxSize * 10000;
if (null == aisInfoList && aisInfoList.size() > maxSize) {
return true;
}
else {
return false;
}
}
}
}
2 程序中得到原始数据后,将其保存到内存中。
如(某个类的普通方法):
public void inserToAISH(AisInfo aisInfo_old) {
//改为加入到内存中
AisHistoryServiceFactory.getInstance().addAisInfo(aisInfo_old);
}
3 程序中启动一个子线程(一直循环,不断的去扫描),用来读取内存中的数据。
如(最好放在启动的servlet中):
new AisHistoryServiceAisThread().start();
子线程类:
public class AisHistoryServiceAisThread extends Thread{
/**
* Description: <br>
*
* @author XXX<br>
* @taskId <br> <br>
*/
@Override
public void run() {
// TODO Auto-generated method stub
//super.run();
try {
Thread.sleep(10 * 1000);
//System.out.println("开始启动读取数据的线程了");
AIS_LOG.INFO("开始启动读取港航局历史轨迹的数据的线程了");
while (true) {
AisHistoryAisFactory.getInstance().addAisDataToHistory();
Thread.sleep(10 * 1000);
}
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4 子线程会进行得到数据后的操作(分批次的读取数据,每次读取1000条。)。
如(普通类的普通方法,可以弄成单例的):
public class AisHistoryAisFactory {
private int ais_num = 1000;
private static AisHistoryAisFactory webServiceaisFactory = null;
private static AisInfoService aisInfoService = (AisInfoService) SpringBeanFactory.getInstance().getBean(SpringBeanMacroDef.Service.AIS_INFO_SERVICE_IMPL);
private static FerryService ferryService = (FerryService) SpringBeanFactory.getInstance().getBean(SpringBeanMacroDef.Service.FERRY_SERVICE_IMPL);
private AisHistoryAisFactory() {
}
public static AisHistoryAisFactory getInstance() {
if (webServiceaisFactory == null) {
webServiceaisFactory = new AisHistoryAisFactory();
return webServiceaisFactory;
}
else {
return webServiceaisFactory;
}
}
public void addAisDataToHistory() {
//WebServiceAisParseFactory aisParseFactory = WebServiceAisParseFactory.getInstance();
AisInfo aisInfo = new AisInfo();
AisInfo aisInfo_old = null;
List<AisInfo> aisDataList = new ArrayList<AisInfo>();
AisHistoryServiceFactory.getInstance().getAisInfo(aisDataList, ais_num);
int insert_num = 0;
int updata_num = 0;
/* 这是插入到redis中
for (int i = 0; i < aisDataList.size(); i++) {
String aisData = aisDataList.get(i).toString();
//System.out.println(aisData);
aisInfo = aisParseFactory.parseAIS(aisData);
if(aisInfo==null){//为空则不进行保存到redis中
System.out.println("出现解析gis数据错误,拼装为aisInfo时,返回的aisInfo为空,aisData="+aisData);
AIS_LOG.INFO("出现解析gis数据错误,拼装为aisInfo时,返回的aisInfo为空,aisData="+aisData);
}else{//增加操作,放入redis库
RedisFactory.getInstance().setAisInfo(aisInfo);
}
}
AIS_LOG.INFO("插入了:" + aisDataList.size() + "的ais数据");*/
// System.out.println("插入了:"+insert_num+"的ais数据。 更新了:"+updata_num);
//这是进行批操作,插入到数据库中.调用jdbc批处理。
DBCPHelper.batchInsert(aisDataList);
}
}
!!!注意,保存数据的类需要是线程安全的(通过单例+虚拟锁达到线程安全).如上述的AisHistoryServiceFactory类
通过这种方式就可以解决程序中得到大量数据。还需要将其大量数据保存到redis或者数据库中。
!!!注意,读取内存数据时,是分批次读取。如:每次读取1000条数据。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/小蓝xlanll/article/detail/267898
推荐阅读
article
图像
美化
滤镜
设计
及实现...
图像
平滑是一种预处理
图像
的方法,在整个
图像
上平均一个像素和其邻居像素的值,从而产生一个更平滑的外观。近年来,
图像
处理技术...
赞
踩
article
c++
多线程
生产者
与
消费者
模型_
生产者
消费者
多线程
案例
c++
...
前言 在
多线程
中,
生产者
与
消费者
模型是一个非常经典的问题。 假设有一个厨师做馒头,另外一个顾客吃厨师做的馒头,这样生...
赞
踩
article
微信
小
程序
抓包-夜神
模拟器
结合
BurpSuite
抓包(可用于现在最新版本
微信
)_雷电
模拟器
抓
微信
小
程...
即可,我看另外一个人的教程计算生成出来的结果和这个一样,可能是统一的吧。这一步好像可以跳过,直接把转换后的per证书名称...
赞
踩
article
Oracle
_
高级功能(
3
)
synonym
和
database
link
...
一、同义词
synonym
connect sys/12
3
as sysdba;select * from emp;ORA-...
赞
踩
article
164道
网络
安全
工程师
面试
题(附答案)_
网络
信息安全
工程师
面试
...
最近有不少小伙伴跑来咨询:想找
网络
安全
工作,应该要怎么进行技术
面试
准备?工作不到 2 年,想跳槽看下机会,有没有相关的面...
赞
踩
article
第67篇
Android
Studio
实现聊天记录
界面
-
ListView
多形式
界面
_
android
...
第67篇
Android
Studio
实现聊天记录
界面
-
ListView
多形式
界面
1.需求2.文件目录3.主
界面
布局4....
赞
踩
article
Android
jetpack
介绍和
为什么
要
使用
_安卓
jetpack
...
Jetpack 是 Google 为解决
Android
开发碎片化,打造成熟健康生态圈提出的战略规划,是 Google...
赞
踩
article
聊一聊
ARP
/R
ARP
/
IP
/
DNS
协议
_ip
协议
组
arp
...
一.
ARP
协议
1.概述地址解析
协议
,是根据
IP
地址获取物理地址的一个TCP/
IP
协议
,主机发送信息时将包含目标
IP
地址的...
赞
踩
article
Android
studio
切换标签
快捷键
(
Alt
+左右键)_
alt
+右箭头...
Android
studio
切换标签、内部切换页面
快捷键
(
Alt
+左右键):
Alt
+左箭头(←):选择上一个标签(s...
赞
踩
article
riru
_
riru
-
core
...
riru
官网https://github.com/RikkaApps/Riru
riru
原理 Riru的原理是通过替换会被...
赞
踩
article
微信小
程序
java
springboot
42.
开放
实验室
预约
管理系统
(完整源码+
数据库
文件+万字...
这次开发的
开放
实验室
预约
管理系统
对字典管理、公告管理、课题报名管理、老师管理、
实验室
管理、
实验室
预约
管理、学生管理、管理...
赞
踩
article
sql
语句中关于
group
by,
order
by 和
limit
书写的
先后顺序
_
oracle
sql
...
在写
sql
的时候,
group
by,
order
by 和
limit
之间的
先后顺序
是有约定的,一定要按照
group
by,...
赞
踩
article
Java
毕业设计
-基于
springboot
vue
开发
的
MOBA
类
游戏
攻略分享平台-
毕业论文
+答辩P...
Java
毕业设计
-基于
springboot
vue
开发
的
MOBA
类
游戏
攻略分享平台-
毕业论文
+答辩PPT(附
源代码
+演示...
赞
踩
article
【基于
PyTorch
实现经典
网络
架构的花卉
图像
分类
模型
】_花朵
分类
模型
用哪种
数据
增强
技术比较好...
本文基于
PyTorch
框架,使用经典的卷积神经
网络
(CNN)架构,对花卉
图像
进行
分类
任务。我们介绍了如何使用PyTorc...
赞
踩
article
Android
连接
SQLServer
详细教程(
数据库
+服务器+客户端)_安卓
sqlserver
连接
...
本文为原创,如果转载请注明出处 http://blog.csdn.net/zhyl8157121/article/det...
赞
踩
article
三套大厂
网络安全
工程师
面试题
(
附答案解析
)
冲刺
金三银
四...
三套大厂
网络安全
工程师
面试题
(
附答案解析
)
助力你在
金三银
四中斩获心仪的大厂offer!三套大厂
网络安全
工程师
面试题
(
附答...
赞
踩
article
MAC更改
chrome
driver
版本
_
mac
chrome
如何切换
版本
...
前言:今天用selenium突然报错了,一看报错内容是Chrome驱动过低,仅支持Chrome76
版本
,这里应该是Chr...
赞
踩
article
CGAL
基于
曲面
拟合
的
点云
平滑...
基于jet surface的
点云
平滑
CGAL
基于
曲面
拟合
的
点云
平滑 ...
赞
踩
article
Google
IO 2023推出
Android
Studio
官方
AI
工具
Studio
Bot
...
在2023
Google
I/O大会上,
Google
宣布在
Android
Studio
中推出了一款名为 Studi...
赞
踩
article
MySQL
主从
延迟
问题排查_
查询
从库
耗时吗...
通常情况下我们的业务都是读多写少型的业务模式,数据库层面针对该模式下的优化,一般建议使用
MySQL
一主多从的读写分离架构...
赞
踩
相关标签
计算机视觉
图像处理
opencv
matlab
多线程
微信小程序
小程序
数据库
web安全
面试
安全
android studio
android
android-studio
android jetpack
Alt+上下左右键
java
spring boot
uniapp
maven
mysql
sql
课程设计
毕业设计