docker镜像极致压缩(二)
之前在一篇文章中提到 如何在编译镜像的时候尽量缩小镜像的体积 以用于网络传输,这次在构建另一个镜像的时候,采用了更为激进的办法,直接将原来4G的镜像,缩小到了1G左右,压缩更明显,图片见对比。
抛开场景谈需求都是耍流氓
- 原来的镜像用了很多年了,且是基于 CentO[……]
docker镜像极致压缩(二)
之前在一篇文章中提到 如何在编译镜像的时候尽量缩小镜像的体积 以用于网络传输,这次在构建另一个镜像的时候,采用了更为激进的办法,直接将原来4G的镜像,缩小到了1G左右,压缩更明显,图片见对比。
项目中使用了emqx来对硬件进行管理和状态数据的更新,但由于错误的使用姿势,导致在某个项目中,硬件设备超过了500个后,后台服务器接收处理mqtt的消息达到了惊人的2分钟延迟。
而项目甲方的服务器问题,导致无法修改emqx的配置来进行调优,流程特别繁琐,而且在调整过程中需要[……]
在目前网络环境这么好的情况下,大文件传输似乎已经没有什么问题了,动辄上G的文件传起来也不在话下,在这个场景下,再大的镜像体积,看起来也没什么问题。我这个镜像体积也不算过分,但是需要通过微信传输 – SVN推送 – SVN下载 – 镜像推送 – K8S 部署这几个步骤,一整套[……]
先说结论,这是一个非常愚蠢的问题,一个错误的开始,怎么也不可能有正确的结果。
最近在研究SpringCloud,于是学习了一下Ruoyi Cloud版本,本来一切都很顺利,直到在集成Seata分布式任务的时候,使用 @GlobalTransactional 连用 @Transactional的时[……]
本项目用于本地化查询、导出 HMDB
中的代谢物的信息。原始数据来自于:https://hmdb.ca/downloads (版本5.0,Data Set of All Metabolites),原始文件非常大,大约在 6G,先使用 Python 将原始代谢物的数据导入到 Mongo DB 中,然后再在Java项目中提供查询和导出。
先要解决的一个问题就是如何读取一份超级大的XML文件,一次性读取到内存里显然不适合,虽然这次文件不大,只有6G,在生信分析的服务器动辄512G的内存前面来说就是弟弟,但必定开发还是在本地,而且保不齐后面文件还是会有更新
Python解析XML的库很多,用了 xml.etree.ElementTree 来处理,使用 iterparse 方法来迭代每一个标签,当遇到你需要处理的标签的时候,就来处理,并且使用了一个生成器(这里完全为了体验一下Python语法,也可以不用)
#!/usr/bin/python3
import xml.etree.ElementTree as ET
import psutil
import os
import xmltodict, json
from MongoDBUtil import MongoDBUtil
#这是原始xml里的namespace
namespace = '{http://www.hmdb.ca}';
def hmdbParse(filename, groupTag):
'''
增量解析 filename ,并且按groupTag作为一组,其实这里就是 metabolite 了
使用了生成器,并且使用
'''
ET.register_namespace("xmlns","http://www.hmdb.ca")
#迭代文件,增量
doc = ET.iterparse(filename, ('start', 'end'))
# Skip the root element
next(doc)
#循环读取解析器得到的结果
for event, elem in doc:
if event == 'end':
#一旦是结束标签,并且是你想要的标签,就return出去
if namespace+groupTag == elem.tag:
yield elem
#这里是把上一次的标签清空掉,这样就不会占用太多内存
elem.clear()
if __name__ == "__main__":
#xml文件地址,和需要解析的标签
data = hmdbParse('hmdb_l30000.xml', 'metabolite')
mongoUtil = MongoDBUtil(ip="127.0.0.1", db_name="bio_db", port="27017")
insertBatch = []
idx = 0
for meta in data:
#使用自带方法转换成xml字符串的字节流
xmlstr_byte = ET.tostring(meta, encoding='utf8', method='xml')
#转换成UTF8的xml字符
xmlstr = str( xmlstr_byte,encoding = "utf8" ).replace("xmlns:","");
#转成字典
xmldict = xmltodict.parse(xmlstr)
accessionId = meta.findtext(namespace+"accession")
#批量插入
insertBatch.append(xmldict)
idx+=1
if(idx % 500 == 0):
#500条插入一次
mongoUtil.insert_many(collect_name="hmdb2210", documents=insertBatch)
#插入后清理一下
insertBatch.clear()
print("insert 500 data, clear")
#如果循环执行完了,insertbatch中还有小于500的,那就执行完,因为我也不知道
#怎么判断生成器是不是执行到了最后一个行
if(len(insertBatch) < 500):
mongoUtil.insert_many(collect_name="hmdb2210", documents=insertBatch)
print('all data done.')
[……]
最近在学习智能推荐这块的内容,以前从来没有接触过,而且对数学、算法这类的知识是有所欠缺的,所以学习起来可能会费力些,所以就基于百度AI平台做一些demo
一共3个部分,分别是 用户信息、项目(Item)信息、用户和内容关联信息,拿常见的电影喜好预测来说,用户信息是网站用户,项目信息[……]
一直以来 Thumbnailator 都是图片压缩、制作缩略图的利器,也是一直在更新,最近一次的更新也是在2022年的1月初。(https://github.com/coobird/thumbnailator)
最近项目中遇到一个分享的功能,需要后台合成一张图片,图片除了本身的模板之外,还有一个用户[……]
先简单描述一下状况,有订单相关业务,一共有2个service类,一个操作订单简称order(Service),一个操作库存的,简称inventory(Service),在order中有A方法,是在数据库中新增订单数据的,在inventory中,有B方法,是扣除库存用的,在方法A中,会调用B,这2个s[……]
在MyBatisPlus的使用过程中,之前很多时候都是使用queryWrapper(条件构造器)的构造方法传入实体对象,来实现条件的构造,例如
contentCategoryService.list(new QueryWrapper<ContentCategory>(contentCat[......]
最近在使用MyBatisPlus的时候遇到一个问题,就是controller中被spring封装bean,在默认使用MP的QueryWrapper构造查询的时候主键是空字符,也就是""
的时候,仍然会被作为查询条件,被拼接到sql中了。
例如
productService.lis[......]