searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Office调研——Office的缓存机制

2023-07-28 03:02:55
53
0

问题提出原因、背景

在高可用云电脑的项目中,需要将云电脑中的所有文件同步到另一台云电脑中,这些文件中就有许多是Office文件。而在实际运行中发现,Office源文件的微小改动,都会使得整个Office文件都需要重新同步,例如,在Word文件的末尾中,添加一个逗号,整个Word文件都发生了变化(在磁盘层面观察)。这样同步传输时耗费的时间和网络资源都很大。

因此,需要调研Office的缓存机制,了解为何Office的微小改动会导致整个文件都发生变化,继而得出该问题的解决办法。

1.问题描述

  1. 研究Office的缓存机制,落盘的规则,解答为何Office的微小改动会导致整个文件都发生变化。
  2. 寻找方法,在Office新增数据落盘时拦截到数据,实现增量传输。

2.Office软件工作过程

经过调研,发现Office软件的基本工作过程:

  1. 用户在打开的Office软件中,编辑和输入数据。
  2. Office将新增的数据以对象模型的方式缓存在内存中。
  3. 当用户点击“保存”时,将内存中的对象模型以其特有的文件结构落盘到磁盘中。
  4. 将这些特殊文件结构的文件,压缩,形成独有的格式(.word .xlsx .pptx),其本质就是一种压缩格式。

过程如下图:

这里只是得到了Office的基本工作过程,还无法得知为何微小的改动,会导致整个文件都发生改变。继续调研。

2.1.Office-Word 的缓存机制

经过调研,发现Office-Word的的缓存,落盘的机制:

  1. 用户打开文件时,word将全量数据读取到内存中
  2. 用户编辑和输入数据时,word将新增的数据写入到内存中
  3. 用户点击“保存”时,word将内存中的全量数据(包含了新增的数据),写入(落盘)到新的文件中!
  4. word将旧的文件删除,将新的文件改名,改成旧的文件名。(替换)

由此可以解释为何微小的改动,会导致整个文件都发生改变。因为每次保存,Word都写入到新的文件中,所以从磁盘层面观察,无论是多微小的改动,都是产生了一个新文件。

如下图:

由上图得到增量传输的方法有如下三种:

  1. 用户层面:利用第三方工具,如python,比较文本,图片,等用户输入数据的差异,对这些差异数据进行传输。
  2. 操作系统层面:获取到缓存里的内容。(目前获取缓存的方法调研中)
  3. 磁盘层面:比较具体的磁盘块的修改情况,对修改过的块进行传输(fsync中就是这种方法,但是实际运行中发现大部分块都产生了变化,传输的数据量太大,需要避免该种方法)

3.利用文件系统监控工具验证保存机制

本节利用文件系统监控工具验证由2节得出Office每次保存都写入到新的文件中的结论。

3.1.对ppt-源文件监控

Office-ppt点击“保存”的过程:

  1. 创建 ./ppt454F.tmp 文件
  2. 更新写入 ./ppt454F.tmp 文件
  3. 对 ./test001.pptx 更名为 ./94955464.tmp 文件 (Renamed)
  4. 对 ./ppt454F.tmp 更名为 ./test001.pptx (Renamed)
  5. 删除 ./94955464.tmp (removed)

3.2.对word-源文件监控

Office-word点击“保存”的过程:

  1. 创建 ./~WRD002.tmp 文
  2. 更新写入 ./~WRD002.tmp 文件
  3. 对 ./新建 Microsoft Word 文档.docx 更名为 ./~WRL003.tmp 文件 (Renamed)
  4. 对 ./~WRD002.tmp 更名为 ./新建 Microsoft Word 文档.docx(Renamed)

3.3.对excel-源文件监控

Office-excel点击“保存”的过程:

  1. 创建 ./40AAAC20 文件
  2. 更新写入 ./40AAAC20 文件
  3. 对 ./test_my_exc.xlsx 更名为 ./E23797D.tmp 文件 (Renamed)
  4. 对 ./40AAAC20 更名为 ./test_my_exc.xlsx(Renamed)
  5. 删除 ./E23797D.tmp 文件(Removed)

3.4.结论

Office文件保存时,是写入一个新的文件,然重命名替换了旧文件,所以修改一次,底层的磁盘块全部都会变动。

4.office自动保存机制(调研后发现非通用机制,暂不考虑)

新问题:office自带的自动保存机制是否可以获取到增量信息?

默认存储路径:

C:\Users\Administrator\AppData\Roaming\Microsoft\PowerPoint\

C:\Users\Administrator\AppData\Roaming\Microsoft\PowerPoint\test001310358634028823171

4.1.自动保存文件的性质

ppt的为 .ppt文件,可以直接打开,如下:

word的为 .asd 文件,不能直接打开,如下:

经过调研,这些自动保存的文件可以通过以下方法恢复成原始文件,如下:

  1. 将自动保存的文件拷贝到所需的地方,如 d:\\back,(ppt为 .ppt 文件,docx为 .asd 文件)
  2. 将新的ppt或者word的自动保存路径,设置为 d:\\back
  3. 选择“管理文档”,“恢复未保存的文档”,即可恢复文档

4.2.结论

自动保存的文件为完整的文件,并不是增量的文件。无法获得增量信息。从这里也侧面证明了Office是将缓存里的文件写入到新的文件中的。

5.获取Office增量数据考虑的方法

经过调研,可以考虑的方法如下:

  1. 将ppt解压,变成分散的文件,对比各个文件的差异,按照文件的方式去传。【不可行】
    1. 问题1:解压后的大小是否会比原来的ppt文件要大?
      1. 答:378KB解压后是429KB,31KB解压后是81KB,解压后的文件会比原PPT大,但是如果对比文件,寻找到增量部分的文件传输,传输量会比原PPT要小。
    2. 问题2:解压后的分散文件是否还能合回ppt文件?
      1. 答:暂时没找到合回的方法。
  2. 利用python,读取ppt,在python内比较两个ppt之间的差异,将差异部分以某种文件的形式保存下来,传送这个差异文件。【以提高io作为代价,降低传输量】
    1. 问题1:能否寻找到差异部分?
      1. 答:可以利用代码实现。有demo程序。
    2. 问题2:如何获取到原ppt和修改后的ppt?
      1. 答:利用临时文件,或原ppt留存一份备份。
  3. 利用VBA编程,将代码直接插入到Office里面,获取Office的增量数据。【从缓存中取增量数据,调研中】
    1. 问题1:验证是否可行?
      1. 答:VBA代码可以拿到未保存的数据,但是需要在用户的Office软件上嵌入代码,然后连接agent程序也需要考虑,流程上可能较为复杂。
  4. 传输增量不行的话,把office文档压缩,传输全量。【效果不明显】
    1. 问题1:原本office文档已经是一种压缩的格式了,再次压缩效果不明显(待提供数据)。

5.1.结论

经过调研,目前“3.利用VBA编程,将代码直接插入到Office里面,获取Office的增量数据”,较为可行,但还需要进一步调研。

6.综合结论

1.研究Office的缓存机制,落盘的规则,解答为何Office的微小改动会导致整个文件都发生变化。

答:Office软件在每次保存中,都将全量数据(包括增量)写入到新的文件中,所以从磁盘层面观察,无论是多微小的改动,都是产生了一个新文件。

2.寻找方法,在Office新增数据落盘时拦截到数据,实现增量传输。

答:利用VBA编程,将代码直接插入到Office里面,获取Office的增量数据,较为可行,但还需要进一步调研。

0条评论
0 / 1000
w****n
4文章数
0粉丝数
w****n
4 文章 | 0 粉丝
原创

Office调研——Office的缓存机制

2023-07-28 03:02:55
53
0

问题提出原因、背景

在高可用云电脑的项目中,需要将云电脑中的所有文件同步到另一台云电脑中,这些文件中就有许多是Office文件。而在实际运行中发现,Office源文件的微小改动,都会使得整个Office文件都需要重新同步,例如,在Word文件的末尾中,添加一个逗号,整个Word文件都发生了变化(在磁盘层面观察)。这样同步传输时耗费的时间和网络资源都很大。

因此,需要调研Office的缓存机制,了解为何Office的微小改动会导致整个文件都发生变化,继而得出该问题的解决办法。

1.问题描述

  1. 研究Office的缓存机制,落盘的规则,解答为何Office的微小改动会导致整个文件都发生变化。
  2. 寻找方法,在Office新增数据落盘时拦截到数据,实现增量传输。

2.Office软件工作过程

经过调研,发现Office软件的基本工作过程:

  1. 用户在打开的Office软件中,编辑和输入数据。
  2. Office将新增的数据以对象模型的方式缓存在内存中。
  3. 当用户点击“保存”时,将内存中的对象模型以其特有的文件结构落盘到磁盘中。
  4. 将这些特殊文件结构的文件,压缩,形成独有的格式(.word .xlsx .pptx),其本质就是一种压缩格式。

过程如下图:

这里只是得到了Office的基本工作过程,还无法得知为何微小的改动,会导致整个文件都发生改变。继续调研。

2.1.Office-Word 的缓存机制

经过调研,发现Office-Word的的缓存,落盘的机制:

  1. 用户打开文件时,word将全量数据读取到内存中
  2. 用户编辑和输入数据时,word将新增的数据写入到内存中
  3. 用户点击“保存”时,word将内存中的全量数据(包含了新增的数据),写入(落盘)到新的文件中!
  4. word将旧的文件删除,将新的文件改名,改成旧的文件名。(替换)

由此可以解释为何微小的改动,会导致整个文件都发生改变。因为每次保存,Word都写入到新的文件中,所以从磁盘层面观察,无论是多微小的改动,都是产生了一个新文件。

如下图:

由上图得到增量传输的方法有如下三种:

  1. 用户层面:利用第三方工具,如python,比较文本,图片,等用户输入数据的差异,对这些差异数据进行传输。
  2. 操作系统层面:获取到缓存里的内容。(目前获取缓存的方法调研中)
  3. 磁盘层面:比较具体的磁盘块的修改情况,对修改过的块进行传输(fsync中就是这种方法,但是实际运行中发现大部分块都产生了变化,传输的数据量太大,需要避免该种方法)

3.利用文件系统监控工具验证保存机制

本节利用文件系统监控工具验证由2节得出Office每次保存都写入到新的文件中的结论。

3.1.对ppt-源文件监控

Office-ppt点击“保存”的过程:

  1. 创建 ./ppt454F.tmp 文件
  2. 更新写入 ./ppt454F.tmp 文件
  3. 对 ./test001.pptx 更名为 ./94955464.tmp 文件 (Renamed)
  4. 对 ./ppt454F.tmp 更名为 ./test001.pptx (Renamed)
  5. 删除 ./94955464.tmp (removed)

3.2.对word-源文件监控

Office-word点击“保存”的过程:

  1. 创建 ./~WRD002.tmp 文
  2. 更新写入 ./~WRD002.tmp 文件
  3. 对 ./新建 Microsoft Word 文档.docx 更名为 ./~WRL003.tmp 文件 (Renamed)
  4. 对 ./~WRD002.tmp 更名为 ./新建 Microsoft Word 文档.docx(Renamed)

3.3.对excel-源文件监控

Office-excel点击“保存”的过程:

  1. 创建 ./40AAAC20 文件
  2. 更新写入 ./40AAAC20 文件
  3. 对 ./test_my_exc.xlsx 更名为 ./E23797D.tmp 文件 (Renamed)
  4. 对 ./40AAAC20 更名为 ./test_my_exc.xlsx(Renamed)
  5. 删除 ./E23797D.tmp 文件(Removed)

3.4.结论

Office文件保存时,是写入一个新的文件,然重命名替换了旧文件,所以修改一次,底层的磁盘块全部都会变动。

4.office自动保存机制(调研后发现非通用机制,暂不考虑)

新问题:office自带的自动保存机制是否可以获取到增量信息?

默认存储路径:

C:\Users\Administrator\AppData\Roaming\Microsoft\PowerPoint\

C:\Users\Administrator\AppData\Roaming\Microsoft\PowerPoint\test001310358634028823171

4.1.自动保存文件的性质

ppt的为 .ppt文件,可以直接打开,如下:

word的为 .asd 文件,不能直接打开,如下:

经过调研,这些自动保存的文件可以通过以下方法恢复成原始文件,如下:

  1. 将自动保存的文件拷贝到所需的地方,如 d:\\back,(ppt为 .ppt 文件,docx为 .asd 文件)
  2. 将新的ppt或者word的自动保存路径,设置为 d:\\back
  3. 选择“管理文档”,“恢复未保存的文档”,即可恢复文档

4.2.结论

自动保存的文件为完整的文件,并不是增量的文件。无法获得增量信息。从这里也侧面证明了Office是将缓存里的文件写入到新的文件中的。

5.获取Office增量数据考虑的方法

经过调研,可以考虑的方法如下:

  1. 将ppt解压,变成分散的文件,对比各个文件的差异,按照文件的方式去传。【不可行】
    1. 问题1:解压后的大小是否会比原来的ppt文件要大?
      1. 答:378KB解压后是429KB,31KB解压后是81KB,解压后的文件会比原PPT大,但是如果对比文件,寻找到增量部分的文件传输,传输量会比原PPT要小。
    2. 问题2:解压后的分散文件是否还能合回ppt文件?
      1. 答:暂时没找到合回的方法。
  2. 利用python,读取ppt,在python内比较两个ppt之间的差异,将差异部分以某种文件的形式保存下来,传送这个差异文件。【以提高io作为代价,降低传输量】
    1. 问题1:能否寻找到差异部分?
      1. 答:可以利用代码实现。有demo程序。
    2. 问题2:如何获取到原ppt和修改后的ppt?
      1. 答:利用临时文件,或原ppt留存一份备份。
  3. 利用VBA编程,将代码直接插入到Office里面,获取Office的增量数据。【从缓存中取增量数据,调研中】
    1. 问题1:验证是否可行?
      1. 答:VBA代码可以拿到未保存的数据,但是需要在用户的Office软件上嵌入代码,然后连接agent程序也需要考虑,流程上可能较为复杂。
  4. 传输增量不行的话,把office文档压缩,传输全量。【效果不明显】
    1. 问题1:原本office文档已经是一种压缩的格式了,再次压缩效果不明显(待提供数据)。

5.1.结论

经过调研,目前“3.利用VBA编程,将代码直接插入到Office里面,获取Office的增量数据”,较为可行,但还需要进一步调研。

6.综合结论

1.研究Office的缓存机制,落盘的规则,解答为何Office的微小改动会导致整个文件都发生变化。

答:Office软件在每次保存中,都将全量数据(包括增量)写入到新的文件中,所以从磁盘层面观察,无论是多微小的改动,都是产生了一个新文件。

2.寻找方法,在Office新增数据落盘时拦截到数据,实现增量传输。

答:利用VBA编程,将代码直接插入到Office里面,获取Office的增量数据,较为可行,但还需要进一步调研。

文章来自个人专栏
Office缓存机制调研
4 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
1
0