pandas内存优化

在使用Pandas 处理IPGeo 数据时,发现在云服务器上无法执行,总是被系统 Killed . 排查系统日志 确认是 内存溢出被系统沙雕了.
然后在查询相关资料,Linux 下的 OOM 机制:

egrep -i -r 'killed process' /var/log

接下来先提高运行环境的内存吧, 当前是 8G 内存,换 16G 的内存之后还是 Killed

numpy.core._exceptions.MemoryError: Unable to allocate 843. MiB for an array with shape (4, 27639374) and data type object

修改下系统设置吧:

echo 1 > /proc/sys/vm/overcommit_memory
启用内存过载模式,无论有多大都允许分配

再次执行:

numpy.core._exceptions.MemoryError: Unable to allocate 843. MiB for an array with shape (4, 27639374) and data type object

没办法,去优化代码吧:

  1. 分片读取后的数据 100w =》 850M 左右, 先删除不要的字段再合并,650M
  2. 设置读取字段为指定类型: 最重要的是 category ; 250M

引申问题:

  1. 空值填充 fillna 无法在 category 类型上填充不存在的 数据.
  2. 主动清理系统内存缓存
    • echo 1 > /proc/sys/vm/drop_caches
    • echo 0 > /proc/sys/vm/drop_caches

1.Unable to allocate 843. MiB for an array with shape
2.Can only use .cat accessor with a ‘category’ dtype”
3.fill value must be in categories pandas
4.Pandas: ValueError: Integer column has NA values in column 2
5.int<=>ip

TCP-粘包

TCP 协议是面向连接的、可靠的、基于字节流的传输层通信协议,应用层交给 TCP 协议的数据并不会以消息为单位向目的主机传输,这些数据在某些情况下会被组合成一个数据段发送给目标的主机。

问题原因

基于字节流的传输协议,会有控制算法 拆分,组合应用层协议的数据

应用层协议 没有定义 消息的边界 导致 接收方 无法 拼接数据

同时 UDP / 网络层IP协议 等不存在粘包问题的原因是:
UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。这就涉及到包大小确定:
UDP包允许发送最大值 64K,理想大小(1500 / 548 内外网)需要应用层来手动处理数据问题,但是TCP不存在包大小限制。

IP协议 基于 数据包 拆分为 IP报文的传输与接收是有边界协议的;并且数据在TCP传输层就会考虑到 IP报文的大小限制,主动分段处理。
IP分片一般用在UDP

阅读全文

计算机网络

笔记:

网络的出现与RFC规范

接入方式

应用层

SMTP 邮件发送服务协议

阅读全文

API数据加密方式01

上报数据加密规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cips  = 密文数据
ost = 上报原始JSON数据
syms = 128位对称加密字符串
pubs = 公钥
nonce = 随机字符串32位

---------------------
- 服务端提供给 SDK 公钥 pubs
SDK 生成32随机字符串 nonce
SDK 利用随机字符串 nonce 对原文数据 ost 对称加密得到密文数据 cips
SDK 利用公钥对 nonce 加密 得到128位 syms
SDK 分隔 syms 为两段 64 位字符串
SDK 逆转拼接到加密数据 cips 形式如下: syms(65-128)+cips+syms(0-64)
SDK 销毁内存中的nonce
SDK 上报数据 cip

1
2
3
4
5
6
7
8
sequenceDiagram
服务端->>SDK: 提供非对称加密-公钥pubs
SDK->>SDK: 生成随机字符串nonce
SDK->>SDK: nonce加密原始数据
SDK->>SDK: pubs加密随机字符串
SDK->>SDK: 拼接密文
SDK->>服务端: 上报数据
服务端->>SDK: 上报成功:下次打点七元组

GO-API数据加密方式02

标准加密规范-02

  • 读取数据,转换[]byte{}
  • 压缩 []byte{}数据 【1.zip,2.gzip】
  • AES 加密 压缩后的数据
  • base64Encode 加密后的数据,输出为UTF-8编码字符串

AES:Key/IV 生成规则

  • 长度上限为20 的随机字符串 (字符串由数字和大、小写字母构成)

数据处理逻辑

数据压缩

  • Zip
  • GZip

代码实现

阅读全文