简介:IBM i2 Analyst's Notebook 8.91 是一套面向情报分析、案件研判与关联关系挖掘的可视化分析软件,适合执法、金融风控、网络安全及企业内部审计等场景的初中级分析人员使用。其核心在于把分散数据转成网络图与图表,借助关联分析、条件检索和多格式数据导入,快速定位实体之间的联系与异常模式,并用模板、工作流和版本回溯组织分析过程。压缩包共42个文件、约443.77MB,以exe安装程序与htm安装向导页为主,另含pdf快速入门和发布说明、doc培训教材,以及msu、dll、xml等预装依赖与配置文件,形成较完整的部署资料。该版本提供免加密狗入口,便于在普通环境完成安装和功能体验。目前已有4680人学习,适合希望系统掌握关系图谱构建、线索梳理和团队协作分析的研究者对照文档上手。
1. 一张 3000 行的流水表,为什么非要塞进关系图里
某公司内审拿到一份 3000 行的供应商付款明细,在表格里筛选、透视、排序折腾了三天,只看到几个金额偏大的户头,看不出问题。把这份数据拆成「实体—链接」两张表画成关系图之后,十分钟就看到三家供应商共用同一个联系人手机号,付款经过两层中转最后指向一位离职采购的关联账户——线索不是算出来的,是看出来的。
i2 Analyst's Notebook 8.91(下称 ANB 8.91)就是干这个的工具:单机离线、实体—链接模型、导入设计器、条件格式、时间轴和路径查找,把散在 CSV、Excel、关系库里的记录变成一张可以反复追问的图。它适合反舞弊、内审、供应链穿透、账务与合同条款核对这类「关系比数字更重要」的分析;不适合要多人并发编辑、百万级实体实时查询的场景。下面按装环境、洗数据、画图、避坑、固化模板的顺序讲,能给参数和脚本的地方都给出来。
2. 装得下才算能用:8.91 的运行边界与选型判断
先讲边界,是因为这个工具最容易翻车的地方不是操作不会,而是把不该它干的活硬塞给它。8.91 是单机桌面应用,图表文件是一种基于桌面数据库引擎的单文件格式,所有实体、链接、属性、图标位置、布局坐标全塞在这一个文件里。它的优点是拷走就能走、离线可查、没有服务端依赖;代价是这个文件有硬上限,而且打开速度和渲染速度会随实体数量非线性下降。
2.1 单文件数据库引擎的硬边界:2GB、十万实体与卡顿拐点
单文件格式沿用的是桌面数据库引擎,文件大小上限 2GB,这是引擎层面的限制,不是配置能改的。实际经验是文件超过 1.2GB 之后,打开、保存、切换视图都会出现肉眼可见的等待;超过 1.5GB 时,一次全量布局可能直接把界面卡到无响应。实体数量方面,两三万实体以内操作还算跟手,五万以上就要靠筛选和选择集分段看,十万级别基本只能靠导入导出做批处理,别再指望拖拽。
先量一下手上的文件和机器,别凭感觉:
# 查图表文件大小与所在磁盘剩余空间(Windows 下可用 PowerShell 等价写法) ls -lh ./case_2024_v3.anb df -h .逻辑说明:.anb是单文件图表,大小直接反映数据量和历史冗余;磁盘剩余空间要留出文件本身两倍以上,因为保存时是先写临时文件再替换,空间不足会直接导致保存失败并且原文件可能损坏。参数上没什么可调的,唯一要养成的习惯是每次大改之前「另存为」一个带序号的副本,这就是这个工具最便宜的后悔药。
| 数据规模 | 建议做法 | 预期体验 |
|---|---|---|
| 5 千实体以内 | 单图直接用,布局随便试 | 流畅 |
| 5 千到 3 万 | 按业务域拆图,主图只放核心节点 | 可接受,布局要等 |
| 3 万到 8 万 | 关掉自动布局,用筛选器分段出图 | 明显卡顿,操作要克制 |
| 8 万以上 | 数据放关系库,图上只放抽样和结论 | 不建议直连全量 |
提示:文件膨胀得最快的原因往往不是实体多,而是历史布局坐标、图片附件和反复的撤销记录。定期用「压缩/另存」重建文件,体积能掉一大截。
2.2 和关系库、图分析工具、表格软件的分工:哪些活别硬塞给 ANB
选型这件事说穿了就是三句话:数据要长期共享、多人同时查,用服务端库;要做大规模网络指标计算和批量算法,用图数据库或图计算框架;要做一次性、可解释、要给非技术同事讲清楚的图,ANB 8.91 仍然是最省事的那个。它真正的强项是「分析师手工介入」这一段:拖一个节点、改一个图标、拉一条时间线、给一组实体上条件格式,这些动作在命令行工具里要么没有,要么写脚本的时间比看图的时间还长。
| 需求 | ANB 8.91 | 服务端图库 | 图分析开源工具 | 表格软件 |
|---|---|---|---|---|
| 离线单文件交付 | 强,拷走即用 | 弱 | 中 | 强 |
| 百万级实体查询 | 不支持 | 强 | 中 | 弱 |
| 手工调整图面表达 | 强 | 弱 | 中 | 不支持 |
| 中心度、社群等指标 | 有基础版 | 强 | 强 | 不支持 |
| 非技术同事能看懂 | 强 | 弱 | 弱 | 中 |
常见做法是分层:原始明细留在关系库或数据仓库,用 SQL 抽出「实体表 + 链接表」两个视图,导出 CSV 再导入 ANB 做分析与呈现。这样图文件永远只装结论级的数据,既不会撑爆,也不怕原始数据更新。
2.3 装完先改这 6 个设置:区域格式、临时目录、图标集、自动保存
装完直接开干的人,十有八九会在第一次导入时被日期坑。8.91 这类桌面应用大量依赖系统区域设置来解析日期和小数点,机器是中文区域、数据里是2024-03-05,通常没事;数据里是03/05/2024,就可能被读成 3 月 5 日或者 5 月 3 日,而且不报错——这是最典型的黑匣子行为。
| 设置项 | 默认/常见值 | 建议值 | 原因 |
|---|---|---|---|
| 系统短日期格式 | 随区域 | yyyy-MM-dd | 消除日月顺序歧义 |
| 小数点符号 | 随区域 | 与数据源一致 | 千分位与小数混淆会导致金额全错 |
| 临时/工作目录 | 系统盘 | 独立 SSD 分区 | 大图布局时临时文件很大 |
| 自动保存间隔 | 较长或关闭 | 5~10 分钟 | 崩溃时损失可控 |
| 撤销层数 | 较大 | 20~30 层 | 层数越多内存占用越高 |
| 界面与标签字体 | 系统默认 | 明确指定中文字体 | 避免标签显示成方块 |
另外两个不写在设置里但必须提前确认的:一是机器内存,8.91 是 32 位时代延续下来的应用,单进程可用内存有限,16GB 内存的机器并不会让它跑得更快,能省的是「别同时开三个大图」;二是安装路径别带中文和空格,某些组件在解析路径时会出问题,这是血泪经验。
3. 把脏数据变成三张表:实体、链接、属性的落地做法
ANB 的导入模型很朴素:你要么导入「实体」,要么导入「链接」,链接通过起止标识符挂到实体上;属性作为附加列带进来。所以真正的工作量不在软件里,在导入之前把数据整理成它认得的形状。下面这套三表结构,我在反舞弊和供应链穿透两类项目里反复用,基本不用改。
3.1 实体表与链接表的最小字段设计
实体表至少要有一列稳定标识符(Identifier),一列展示名(Label),一列类型(Type)。链接表要有起始标识符、结束标识符、链接类型、链接标签,再加上时间和权重两列。标识符千万不要用姓名,要用「类型前缀 + 业务主键」,比如P_0001、C_10086、ACC_6222...,因为姓名会重、会改、会多音字。
# entity.csv —— 实体表模板,列名可自定义,导入时做映射 Identifier,Label,Type,IDNumber,Phone,RegDate,RiskLevel P_0001,张某,PERSON,3101********1234,138****0001,2019-06-12,HIGH C_10086,某贸易有限公司,ORG,9131**********8X,,2016-03-01,MEDIUM ACC_6222,尾号6222账户,ACCOUNT,6222********, ,2018-09-20,LOW# link.csv —— 链接表模板,From/To 必须能在实体表里找到对应 Identifier From,To,LinkType,Label,TxnDate,Amount P_0001,C_10086,OWNS,法定代表人,2016-03-01,0 C_10086,ACC_6222,HOLDS,基本户,2018-09-20,0 ACC_6222,ACC_8899,TRANSFER,转账,2024-03-05,1280000逻辑说明:实体表每行一个节点,链接表每行一条边。Type列决定节点用哪套图标和配色,是整张图可读性的地基,宁可多花半小时把类型收敛到 10~15 类,也不要放任几十个自由文本。Amount用数字类型,后面条件格式按数值分档上色就靠它;TxnDate必须是真正的日期类型,用文本存日期,时间轴视图里根本不会出现这条记录。
| 字段 | 类型 | 必填 | 常见错误 |
|---|---|---|---|
| Identifier | 文本 | 是 | 用姓名或含空格的拼接串 |
| Label | 文本 | 是 | 太长,图上被截断 |
| Type | 文本 | 是 | 同义不同名(个人/人员/自然人) |
| TxnDate | 日期时间 | 建议 | 存成2024.3.5这类自由格式 |
| Amount | 数字 | 建议 | 带货币符号或千分位 |
注意:标识符里出现空格、制表符、全角字符,是链接挂不上实体最常见的原因,导入前统一做一次 trim 和全角转半角。
3.2 导入设计器的字段映射:类型推断失效的三个地方
导入流程是先选数据源,再指定分隔符和编码,然后在字段映射界面把源列拖到目标属性上,并逐列指定类型。类型推断在这个环节最容易在三个地方失效:日期列被猜成文本、数字列因为千分位被猜成文本、多值列(一个实体对应多个电话)没有指定分隔符而被当成单个长字符串。
具体操作顺序是:先做一次小样本导入(取前 200 行)验证映射,确认无误后保存导入规格文件,再用同一份规格跑全量。规格文件的价值在于可复用和可交接——换台机器、换个人,照规格跑就行,不用重新猜一遍字段类型。
| 源数据形态 | 应指定类型 | 处理方式 |
|---|---|---|
2024-03-05 14:22:01 | 日期时间 | 显式给出格式串 |
2024/3/5 | 日期时间 | 补零后统一格式 |
1,280,000.00 | 数字 | 先去掉千分位 |
13800000001;13900000002 | 多值文本 | 指定分号或竖线为分隔符 |
空字符串与NULL | 文本 | 统一为空,别混用占位符 |
编码这一项单独拎出来说:文本源默认可能按系统本地代码页读取,UTF-8 文件如果没带字节序标记,中文很容易变成乱码。稳妥做法是文件存成带标记的 UTF-8,或者在导入向导里显式选编码,别指望它自己猜对。
3.3 用脚本把姓名、电话、账号标准化后再进图
下面这段清洗脚本是每次项目开工都要跑的第一道工序,做四件事:全角转半角、去首尾空白与不可见字符、电话归一成 11 位纯数字、账号按固定长度左补零。跑完之后实体表和链接表里的标识符就能稳定对齐。
import re import pandas as pd def normalize_text(s: str) -> str: """全角转半角 + 去空白 + 去不可见字符""" if s is None or (isinstance(s, float) and pd.isna(s)): return "" s = str(s) s = "".join(chr(ord(c) - 0xFEE0) if 0xFF01 <= ord(c) <= 0xFF5E else c for c in s) s = s.replace("\u3000", " ").replace("\u200b", "") return re.sub(r"\s+", "", s).strip() def norm_phone(s: str) -> str: """电话归一:去掉 +86、86 前缀和所有非数字,保留 11 位""" d = re.sub(r"\D", "", normalize_text(s)) if d.startswith("86") and len(d) == 13: d = d[2:] return d[-11:] if len(d) >= 11 else d def norm_account(s: str, width: int = 19) -> str: """账号归一:纯数字后左补零到固定长度,避免导入后被当成数字截断""" d = re.sub(r"\D", "", normalize_text(s)) return d.zfill(width) if d else "" ent = pd.read_csv("raw_entity.csv", dtype=str, encoding="utf-8-sig") ent["Label"] = ent["Name"].map(normalize_text) ent["Phone"] = ent["Phone"].map(norm_phone) ent["IDNumber"] = ent["IDNumber"].map(normalize_text).str.upper() ent["Identifier"] = ent["Type"].str.upper() + "_" + ent["IDNumber"] lnk = pd.read_csv("raw_link.csv", dtype=str, encoding="utf-8-sig") lnk["From"] = lnk["From"].map(normalize_text) lnk["To"] = lnk["To"].map(normalize_text) lnk["Amount"] = pd.to_numeric(lnk["Amount"].str.replace(",", ""), errors="coerce").fillna(0) lnk["TxnDate"] = pd.to_datetime(lnk["TxnDate"], errors="coerce").dt.strftime("%Y-%m-%d %H:%M:%S") valid = set(ent["Identifier"]) orphan = lnk[~lnk["From"].isin(valid) | ~lnk["To"].isin(valid)] print(f"实体 {len(ent)} 条,链接 {len(lnk)} 条,孤立链接 {len(orphan)} 条") ent.to_csv("entity.csv", index=False, encoding="utf-8-sig") lnk.to_csv("link.csv", index=False, encoding="utf-8-sig")逻辑说明:encoding="utf-8-sig"读写都带字节序标记,导入时中文不会乱码,这一条能省掉一半的排查时间。dtype=str强制所有列按文本读,防止电话号码前导零和长账号被自动转成科学计数法。errors="coerce"把无法解析的金额和日期变成空值而不是抛异常,随后统一填充,保证脚本不会因为几行脏数据整个中断。orphan那段是最有用的自检:链接两端在实体表里找不到对应标识符的数量,正常应该是 0,一旦不是 0,说明标识符生成规则不一致,别急着导入,先把这个数压到 0。
参数上值得调的就两个:账号补齐宽度按你的业务主键长度定,别照抄;日期输出格式统一成YYYY-MM-DD HH:MM:SS,是为了让导入时的格式串只有一种,减少幻觉。
3.4 增量导入与重复实体合并:同实体判定怎么用才不出错
第一次导入是一张白纸,后面每次补数据才是真麻烦。ANB 支持把新数据追加到现有图表上,区分「新增」和「已存在」靠的就是同实体判定:标识符完全相同算同一个,或者按某些属性组合判定。这里有个不可逆的点——合并动作一旦执行,多个实体被并成一个,链接重新指向,撤销栈里也未必能完整回退。
稳妥的增量做法是先在源库里算出差异集,只导新增和变更,不要每次全量重灌:
-- 取本次新增的转账链接:按业务流水号做左连接比对 SELECT t.txn_id, t.from_acct, t.to_acct, t.amount, t.txn_time FROM stg_transfer t LEFT JOIN dw_transfer d ON d.txn_id = t.txn_id WHERE d.txn_id IS NULL AND t.txn_time >= '2024-03-01' AND t.txn_time < '2024-04-01' ORDER BY t.txn_time;逻辑说明:LEFT JOIN ... IS NULL是找差异集最稳的写法,比NOT IN安全(后者遇到空值会整体返回空集,这个坑很多人踩过)。时间范围用左闭右开,避免边界那一天的重复和遗漏。导出的这份差异集直接对应链接表模板,导入时选追加模式即可。
同实体判定给三条实践建议:能按标识符精确匹配就绝不按名称模糊匹配;确实需要按属性组合判定时,把组合条件写进属性字典文档里,让所有人用同一套;合并前先另存副本,合并后再抽查几条链接的指向是否正确。
4. 让图自己说话:布局、条件格式、路径与时间轴
数据进图之后,同一份数据画出来可以是天书也可以是结论,差别全在表达层。这一章讲四件事:布局怎么选、条件格式怎么设、路径查找参数怎么给、时间轴怎么把顺序变成证据。
4.1 布局算法怎么挑:环形、层次、孔雀图与力导向的适用面
布局没有最优解,只有匹配不匹配。环形布局适合看「谁和核心节点有直接关系」,层次布局适合有明确上下游的供应链和股权结构,孔雀图适合以某个中心节点向外辐射的资金流向,力导向布局适合看整体聚类——但力导向的结果带随机性,同样数据跑两次形状不一样,汇报材料里要固定下来就得手动微调后锁位置。
| 布局 | 适用场景 | 关键参数 | 注意 |
|---|---|---|---|
| 环形 | 一中心多外围 | 半径、排序字段 | 节点多时圈太挤,先筛选 |
| 层次 | 股权、供应链、审批链 | 层间距、同层排序 | 有环的数据会破坏层次 |
| 孔雀 | 资金从核心向外扩散 | 展开角度、跳数 | 只适合树状结构 |
| 力导向 | 社群发现、整体聚类 | 迭代次数、斥力 | 结果不稳定,需锁位置 |
| 分组 | 按类型分区展示 | 分组字段、区间 | 组太多反而更乱 |
实操建议是「先自动后手工」:先用布局算法跑一版看整体结构,再把关键节点拖到固定位置并锁定,最后对剩下的散点做局部整理。大图布局前务必用筛选器把不相关的实体藏掉,几万个节点一起跑力导向,等十分钟出来的还是一团毛线。
4.2 条件格式:把金额、频次、风险等级变成颜色和图标
条件格式是这张图从「能看」到「好读」的分水岭。它能做的事很直接:按属性值改节点或链接的颜色、粗细、图标、标签显示与否。规则可以叠加,也可以设优先级,靠前的规则先命中。设置时最忌讳一次上十几条规则,图上五颜六色,读者反而什么都记不住。
我的习惯是三档:金额按数量级分三档改链接粗细,频次按分位数分三档改颜色,风险等级用图标标记。规则里能用数值比较就不用文本包含,文本匹配对大小写、空格、全半角都敏感,换一批数据就容易失效。
| 规则 | 作用对象 | 条件 | 视觉结果 |
|---|---|---|---|
| 大额资金 | 转账类链接 | 金额 ≥ 100 万 | 线宽加粗、红色 |
| 高频往来 | 转账类链接 | 月频次 ≥ 10 | 橙色虚线 |
| 高风险实体 | 实体 | 风险等级 = 高 | 红色警示图标 |
| 关键人 | 实体 | 关联度 ≥ 阈值 | 加外框、标签常显 |
4.3 路径查找与关联网络:跳数、方向、中间节点的参数怎么给
路径查找是这套工具里最能出结论的功能:给定两个实体,找出它们之间所有的连接路径,或者找出与某个实体在 N 跳以内有关联的全部节点。参数就三个关键的——最大跳数、允许穿越的实体/链接类型、路径条数上限。跳数每加一跳,计算量和结果数量都是成倍增长,两跳以内通常几百条,三跳就可能上万条,图面直接糊掉。
我的做法是先把中间节点类型限制住:只允许穿越「人」和「公司」,把电话、地址、账户这些高连接度的节点排除在外,路径质量立刻提升一个档次。方向也要想清楚,资金流向是有向的,如果只关心钱的去向就开方向限制;如果是查关联关系(谁认识谁),就把方向关掉。
提示:路径结果出来后别急着截图,先看结果列表里的路径条数和重复度,路径太多通常不是线索多,而是中间节点类型没限制好。
4.4 时间轴与主题线:把先后顺序变成证据链
时间轴视图只认真正的日期类型属性,这是它和工作表最大的区别,也是最多人翻车的地方:日期存成文本,时间轴里空空如也,还以为是软件坏了。前面清洗脚本里那一步日期格式化,就是为了这一刻。
时间轴的粒度按业务定:资金流水看天甚至看小时,股权变更看月,合同履约看季度。粒度太细,轴上全是点看不出趋势;粒度太粗,先后顺序又糊了。主题线则是沿着一条链把事件按时间排开,适合展示「签约—付款—变更—再付款」这种连续动作。用的时候记得把时区统一,跨时区的数据混在一起排出来的顺序是错的,且错得很隐蔽。
5. 避坑与排查:8.91 上最容易翻车的 5 个现场
5.1 导入后中文全是问号或方块
现象:CSV 在表格软件里打开正常,导入之后实体名全是问号、方块或者乱码,链接标签也一样。
原因:源文件是不带字节序标记的 UTF-8,导入时按系统本地代码页解析,中文字节被错误解码;另一部分情况是界面标签字体没指定中文字体,数据其实是对的,只是显示不出来。
解决:文件另存为带标记的 UTF-8 再导;导入向导里显式选择编码,不要用自动;确认界面字体设置里明确指定了中文字体。三步做完还是乱码,就抽前 20 行单独导一次做对照实验,能快速定位是编码问题还是字体问题。
5.2 图越画越卡,文件从 200MB 涨到 1.8GB
现象:项目初期很流畅,两个月后打开要等一分钟,保存时偶尔报错,文件大小接近引擎上限。
原因:每次增量导入都在同一张图上叠加,历史布局坐标、旧版本节点、临时附件全部留在文件里;撤销层数开得太大也会让内存占用飙升。
解决:先把项目按时间或业务域拆成主图和子图,主图只留核心节点;定期另存重建文件压缩体积;把撤销层数降到 20~30;清理不再需要的图片附件。已经逼近上限的文件,用导出实体链接表再导入新文件的「洗图」方式重建,比继续在旧文件上修补划算得多。
5.3 同一个人变成三个实体,合并后链接翻倍
现象:图上同一个联系人出现三个节点,手动合并之后,原本一条的关系变成三条重复链接,图面比合并前还乱。
原因:标识符生成规则不统一,有的用姓名、有的用证件号、有的用「姓名+电话」拼接;合并只合并节点,不自动去重边。
解决:回头统一标识符规则并写进属性字典;合并前先另存副本;合并后按「起止标识符 + 链接类型 + 日期」去重,去重放在导入前的脚本里做,比在图里手工删快得多。根治办法是每次导入前跑一遍 3.3 那段脚本里的孤立链接自检。
5.4 链接方向反了,资金流向图讲反了故事
现象:图上箭头全部指向资金流出方,汇报时被业务方当场指出方向错了。
原因:源数据里「付款方/收款方」两列在映射时对调,或者起止标识符用了同一个字段;还有一种是链接类型本身在建模时就设成了无向。
解决:导入小样本后先抽查 5 条已知方向的记录,确认箭头指向再跑全量;链接类型的「有向/无向」在建类型时就定死,不要事后改;方向一旦改过,条件格式和路径查找的规则要重新验证一遍,因为它们可能依赖方向。
5.5 导入规格换个机器就跑不通
现象:在自己机器上跑得好好的导入规格,交给同事执行,日期全部错位、数字全变文本。
原因:规格里记录的是本机的区域格式和路径,换机器后日期顺序和小数点符号的解析基准变了;源文件路径写成绝对路径也会失效。
解决:规格文件里的日期格式一律写显式格式串,不用「跟随系统」;源文件用相对路径或统一放到约定的工作目录;交接时把规格、样例数据、字段字典三样一起给,让对方先跑 200 行小样本验证。
6. 把一次分析固化成可复用模板:属性字典、图例规范和交付自检
单次把图做得漂亮不难,难的是三个月后换个人接手,还能做出同样质量的图。我现在的做法是每个项目开工就先建三个文件:属性字典、图例规范、交付自检表,全部放在同一个目录下,跟图表文件一起归档。
属性字典管的是「不许自由发挥」:实体类型只允许那十几个,链接类型只允许那几类,每个属性的类型、取值范围、是否多值、由哪个字段映射而来,全部写死。这份东西看起来像行政工作,实际上是整个项目最省钱的一份文档——没有它,第三次增量导入就会出现「个人/人员/自然人」三种类型并存。
图例规范管的是「同一颜色永远是同一个意思」:红色只用于高风险或大额,橙色只用于高频,虚线只用于推测关系(未经证实的关联一定要用虚线,这是底线),中性灰只用于背景实体。规范定下来之后,条件格式的规则就是它的实现,不允许在单张图里临时加例外。
交付自检表我一般做成这样:
| 检查项 | 判定标准 | 常见不通过原因 |
|---|---|---|
| 孤立链接数 | 等于 0 | 标识符规则不一致 |
| 实体类型数 | 不超过 15 类 | 未收敛同义类型 |
| 日期属性类型 | 全部为日期时间 | 存成文本,时间轴失效 |
| 关键节点标签 | 完整可读、不重叠 | 未做局部手工整理 |
| 推测关系 | 全部为虚线 | 条件格式漏配 |
| 图文件体积 | 低于 1GB | 未拆分、未压缩重建 |
| 导出图幅 | 打印可读,A3 内 | 未设分页和缩放 |
这套模板最大的价值不在交付那一刻,而在下一个项目:新项目把字典拷过去改字段名,图和规则半小时就能起来,剩下的时间全花在数据本身。
我踩得最深的一次坑,是贪图省事把三个业务域的数据全塞进一张图,结果文件撑到 1.7GB,布局跑崩两次,最后不得不花两天重建。从那以后我的习惯是:开工先定图的边界和文件体积上限,超过就拆,宁可在主图和子图之间多跳几次,也不让一张图变成谁都不敢动的黑匣子。希望帮到你。
本文还有配套的精品资源,点击获取