EXtremeZip 2021.6.10 → 2021.7.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1254336d170605d3f0c17b2fc3322c03418da714f7989e525eb3719bb990651e
4
- data.tar.gz: 78d353292536ae4a9f5979a89d5855114bb0f698da8e45544bcb4f146f159ba5
3
+ metadata.gz: 1db78a6e233cc5036a528a97794377882998cd83868015f108151739a019c7f9
4
+ data.tar.gz: 9dd9762163a9e310e534b24a8231f5e588cf3497699767d887dbdc91650b350f
5
5
  SHA512:
6
- metadata.gz: be0e958cf5aa67eb5fd738eda5c5b130e764990fe7147059ff05a913250b0c3e258dc18e7b9d4d30306cc458ce3f4c1da22a8bfa2c15e71d9a2bad766bfa11e8
7
- data.tar.gz: 102aa5d67a8cf95f62d46f0592308a7daaf4b989b26c65fc7c567546c2d7e1e7071b23f8a245899a2aa242a1e7b422e1aade9ac5931da25703874d99a925063d
6
+ metadata.gz: cb2aebbdb9f8584a7d80878a8ddaae134bd77284f056b4446cfe5f4a886df1d07b169e5609c8f0d610aa60312847b8a62183b845767461175e68682de51c62e8
7
+ data.tar.gz: 3338d07a08f7347d7b4d5070f64959d6b5e685600bf6be96fd9e42212505649cd579f7a4cac41414fe110f202dc6a3cabe413dd1c076b373c328ee9fe4bfb100
data/bin/exuz CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  require 'extremeunzip.zzaqsu'
4
4
 
5
- if (ARGV.empty? ) #未指定命令行参数。
6
- else #指定了命令行参数。
7
- $rootPath=ARGV[0] #记录要打包的目录树的根目录。
8
-
9
- exuzObject=ExtremeUnZip.new #解压对象
10
-
11
- exuzObject.exuz($rootPath) #解压
5
+ if ARGV.empty? # 未指定命令行参数。
6
+ else # 指定了命令行参数。
7
+ $rootPath = ARGV[0] # 记录要打包的目录树的根目录。
8
+
9
+ exuzObject = ExtremeUnZip.new # 解压对象
10
+
11
+ exuzObject.exuz($rootPath) # 解压
12
12
  end
data/bin/exz CHANGED
@@ -2,11 +2,14 @@
2
2
 
3
3
  require 'extremezip.zzaqsv'
4
4
 
5
- if (ARGV.empty? ) #未指定命令行参数。
6
- else #指定了命令行参数。
7
- $rootPath=ARGV[0] #记录要打包的目录树的根目录。
8
-
9
- exzObject=ExtremeZip.new #创建压缩对象
10
-
11
- exzObject.exz($rootPath) #压缩
5
+ if ARGV.empty? # 未指定命令行参数。
6
+ else # 指定了命令行参数。
7
+ puts("process id: #{Process.pid}"); # Debug
8
+
9
+
10
+ $rootPath = ARGV[0] # 记录要打包的目录树的根目录。
11
+
12
+ exzObject = ExtremeZip.new # 创建压缩对象
13
+
14
+ exzObject.exz($rootPath) # 压缩
12
15
  end
@@ -8,150 +8,143 @@ require 'lzma'
8
8
  require 'get_process_mem'
9
9
 
10
10
  def checkMemoryUsage(lineNumber)
11
- mem= GetProcessMem.new
12
-
13
- puts("#{lineNumber} , Memory: #{mem.mb}"); #Debug
14
-
15
- end #def checkMemoryUsage
16
-
17
- #根据版本号,提取VFS数据内容
18
- def extractVfsDataWithVersionExternalFile(wholeCbor, fileVersion)
19
- victoriaFreshData='' #解压后的数据块整体
20
- dataFileName='victoriafreshdata.w' #数据文件名
21
- dataFile={} #数据文件对象
22
-
23
- if (fileVersion==14) #14版本
24
- compressedVfsData=wholeCbor['vfsData'] #获取压缩后的数据内容
25
-
26
- victoriaFreshData=LZMA.decompress(compressedVfsData) #解压缩数据内容
27
-
28
- dataFile=File.open(dataFileName, 'wb') #打开文件
29
-
30
- dataFile.syswrite(victoriaFreshData) #写入内容
31
-
32
- dataFile.close #关闭文件
33
- elsif (fileVersion>=30) #30以上版本
34
- compressedVfsDataList=wholeCbor['vfsDataList'] #获取压缩后的数据块列表
35
-
36
- puts("data block amont: #{compressedVfsDataList.length}") #Debug
37
-
38
- dataBlockCounter=0 #Data block counter
39
-
40
- dataFile=File.open(dataFileName, 'wb') #打开文件
41
-
42
-
43
- compressedVfsDataList.each do |currentCompressed| #一块块地解压
44
- puts("data block counter: #{dataBlockCounter}") #Debug
11
+ mem = GetProcessMem.new
12
+
13
+ puts("#{lineNumber} , Memory: #{mem.mb}"); # Debug
14
+ end # def checkMemoryUsage
15
+
16
+ # 根据版本号,提取VFS数据内容
17
+ def extractVfsDataWithVersionExternalFile(wholeCbor, fileVersion)
18
+ victoriaFreshData = '' # 解压后的数据块整体
19
+ dataFileName = 'victoriafreshdata.w' # 数据文件名
20
+ dataFile = {} # 数据文件对象
21
+
22
+ if (fileVersion == 14) # 14版本
23
+ compressedVfsData = wholeCbor['vfsData'] # 获取压缩后的数据内容
24
+
25
+ victoriaFreshData = LZMA.decompress(compressedVfsData) # 解压缩数据内容
26
+
27
+ dataFile = File.open(dataFileName, 'wb') # 打开文件
28
+
29
+ dataFile.syswrite(victoriaFreshData) # 写入内容
30
+
31
+ dataFile.close # 关闭文件
32
+ elsif (fileVersion >= 30) # 30以上版本
33
+ compressedVfsDataList = wholeCbor['vfsDataList'] # 获取压缩后的数据块列表
34
+
35
+ puts("data block amont: #{compressedVfsDataList.length}") # Debug
36
+
37
+ dataBlockCounter = 0 # Data block counter
38
+
39
+ dataFile = File.open(dataFileName, 'wb') # 打开文件
40
+
41
+ compressedVfsDataList.each do |currentCompressed| # 一块块地解压
42
+ puts("data block counter: #{dataBlockCounter}") # Debug
45
43
  checkMemoryUsage(34)
46
44
 
47
- currentRawData=LZMA.decompress(currentCompressed) #解压这一块
48
-
49
- dataFile.syswrite(currentRawData) #写入内容
50
-
51
- # victoriaFreshData=victoriaFreshData+currentRawData #追加
52
- # victoriaFreshData << currentRawData #追加
53
-
54
- puts("byte size: #{victoriaFreshData.bytesize}") #debug.
55
-
56
- dataBlockCounter=dataBlockCounter+1 #count
57
- end #compressedVfsDataList.each do |currentCompressed|
58
-
59
- dataFile.close #关闭文件
60
- end #if (fileVersion==14) #14版本
61
-
62
- return dataFileName #返回解压后的数据块整体
63
- end #def extractVfsDataWithVersionExternalFile(wholeCbor, fileVersion) #根据版本号,提取VFS数据内容
64
-
65
- def extractVfsDataWithVersion(wholeCbor, fileVersion) #根据版本号,提取VFS数据内容
66
- victoriaFreshData='' #解压后的数据块整体
67
-
68
- if (fileVersion==14) #14版本
69
- compressedVfsData=wholeCbor['vfsData'] #获取压缩后的数据内容
70
-
71
- victoriaFreshData=LZMA.decompress(compressedVfsData) #解压缩数据内容
72
- elsif (fileVersion>=30) #30以上版本
73
- compressedVfsDataList=wholeCbor['vfsDataList'] #获取压缩后的数据块列表
74
-
75
- puts("data block amont: #{compressedVfsDataList.length}") #Debug
76
-
77
- dataBlockCounter=0 #Data block counter
78
-
79
- compressedVfsDataList.each do |currentCompressed| #一块块地解压
80
- puts("data block counter: #{dataBlockCounter}") #Debug
45
+ currentRawData = LZMA.decompress(currentCompressed) # 解压这一块
46
+
47
+ dataFile.syswrite(currentRawData) # 写入内容
48
+
49
+ # victoriaFreshData=victoriaFreshData+currentRawData #追加
50
+ # victoriaFreshData << currentRawData #追加
51
+
52
+ puts("byte size: #{victoriaFreshData.bytesize}") # debug.
53
+
54
+ dataBlockCounter += 1 # count
55
+ end # compressedVfsDataList.each do |currentCompressed|
56
+
57
+ dataFile.close # 关闭文件
58
+ end # if (fileVersion==14) #14版本
59
+
60
+ dataFileName # 返回解压后的数据块整体
61
+ end # def extractVfsDataWithVersionExternalFile(wholeCbor, fileVersion) #根据版本号,提取VFS数据内容
62
+
63
+ def extractVfsDataWithVersion(wholeCbor, fileVersion) # 根据版本号,提取VFS数据内容
64
+ victoriaFreshData = '' # 解压后的数据块整体
65
+
66
+ if (fileVersion == 14) # 14版本
67
+ compressedVfsData = wholeCbor['vfsData'] # 获取压缩后的数据内容
68
+
69
+ victoriaFreshData = LZMA.decompress(compressedVfsData) # 解压缩数据内容
70
+ elsif (fileVersion >= 30) # 30以上版本
71
+ compressedVfsDataList = wholeCbor['vfsDataList'] # 获取压缩后的数据块列表
72
+
73
+ puts("data block amont: #{compressedVfsDataList.length}") # Debug
74
+
75
+ dataBlockCounter = 0 # Data block counter
76
+
77
+ compressedVfsDataList.each do |currentCompressed| # 一块块地解压
78
+ puts("data block counter: #{dataBlockCounter}") # Debug
81
79
  checkMemoryUsage(34)
82
80
 
83
- currentRawData=LZMA.decompress(currentCompressed) #解压这一块
81
+ currentRawData = LZMA.decompress(currentCompressed) # 解压这一块
82
+
83
+ # victoriaFreshData=victoriaFreshData+currentRawData #追加
84
+ victoriaFreshData << currentRawData # 追加
84
85
 
85
- # victoriaFreshData=victoriaFreshData+currentRawData #追加
86
- victoriaFreshData << currentRawData #追加
86
+ puts("byte size: #{victoriaFreshData.bytesize}") # debug.
87
87
 
88
- puts("byte size: #{victoriaFreshData.bytesize}") #debug.
89
-
90
- dataBlockCounter=dataBlockCounter+1 #count
91
- end #compressedVfsDataList.each do |currentCompressed|
92
- end #if (fileVersion==14) #14版本
93
-
94
- return victoriaFreshData #返回解压后的数据块整体
88
+ dataBlockCounter += 1 # count
89
+ end # compressedVfsDataList.each do |currentCompressed|
90
+ end # if (fileVersion==14) #14版本
91
+
92
+ victoriaFreshData # 返回解压后的数据块整体
95
93
  end # extractVfsDataWithVersion(wholeCbor, fileVersion) #根据版本号,提取VFS数据内容
96
94
 
97
95
  class ExtremeUnZip
98
- #解压
96
+ # 解压
99
97
  def exuz(rootPath)
100
- wholeFileContent=File.read(rootPath) #最终文件内容
101
-
98
+ wholeFileContent = File.read(rootPath) # 最终文件内容
99
+
102
100
  checkMemoryUsage(60)
103
-
104
- puts wholeFileContent.class #debug
105
-
106
- wholeCborByteArray=wholeFileContent[4..-1] #从第5个到末尾
101
+
102
+ puts wholeFileContent.class # debug
103
+
104
+ wholeCborByteArray = wholeFileContent[4..-1] # 从第5个到末尾
107
105
  checkMemoryUsage(65)
108
-
109
-
106
+
110
107
  # puts wholeCborByteArray #Debug.
111
-
108
+
112
109
  checkMemoryUsage(70)
113
- wholeCbor=CBOR.decode(wholeCborByteArray) #解码
110
+ wholeCbor = CBOR.decode(wholeCborByteArray) # 解码
114
111
  # wholeCbor=wholeCborByteArray.from_cbor #解码CBOR
115
-
112
+
116
113
  # puts wholeCbor #Debug.
117
114
  checkMemoryUsage(75)
118
-
119
- fileVersion=wholeCbor['version'] #获取版本号
120
-
121
- puts 'fileVersion:' #Debug
115
+
116
+ fileVersion = wholeCbor['version'] # 获取版本号
117
+
118
+ puts 'fileVersion:' # Debug
122
119
  checkMemoryUsage(80)
123
- puts fileVersion #Debug.
124
-
125
-
126
- if (fileVersion<14) #版本号过小
120
+ puts fileVersion # Debug.
121
+
122
+ if (fileVersion < 14) # 版本号过小
127
123
  checkMemoryUsage(85)
128
- puts 'file version too old' #报告错误
129
- else #版本号够大
130
- compressedVfsMenu=wholeCbor['vfsMenu'] #获取压缩后的目录内容
131
-
124
+ puts 'file version too old' # 报告错误
125
+ else # 版本号够大
126
+ compressedVfsMenu = wholeCbor['vfsMenu'] # 获取压缩后的目录内容
127
+
132
128
  checkMemoryUsage(90)
133
- replyByteArray=LZMA.decompress(compressedVfsMenu) #解码目录VFS字节数组内容
134
-
129
+ replyByteArray = LZMA.decompress(compressedVfsMenu) # 解码目录VFS字节数组内容
130
+
135
131
  # puts replyByteArray #Debug
136
-
132
+
137
133
  checkMemoryUsage(95)
138
134
  # victoriaFreshData=extractVfsDataWithVersion(wholeCbor, fileVersion) #根据版本号,提取VFS数据内容
139
- victoriaFreshDataFile=extractVfsDataWithVersionExternalFile(wholeCbor, fileVersion) #根据版本号,提取VFS数据内容
140
-
135
+ victoriaFreshDataFile = extractVfsDataWithVersionExternalFile(wholeCbor, fileVersion) # 根据版本号,提取VFS数据内容
136
+
141
137
  # puts victoriaFreshData #Debug
142
-
138
+
143
139
  checkMemoryUsage(100)
144
- $clipDownloader=VictoriaFresh.new #创建下载器。
145
-
146
-
147
- $clipDownloader.releaseFilesExternalDataFile(replyByteArray, victoriaFreshDataFile) #释放各个文件
148
-
149
- fileToRemove=File.new(victoriaFreshDataFile) #要删除的文件
150
-
151
- File.delete(fileToRemove) #删除文件
152
-
153
- end #if (fileVersion<14) #版本号过小
154
-
155
- end #def exuz(rootPath)
156
- end #class ExtremeUnZip
140
+ $clipDownloader = VictoriaFresh.new # 创建下载器。
141
+
142
+ $clipDownloader.releaseFilesExternalDataFile(replyByteArray, victoriaFreshDataFile) # 释放各个文件
143
+
144
+ fileToRemove = File.new(victoriaFreshDataFile) # 要删除的文件
145
+
146
+ File.delete(fileToRemove) # 删除文件
157
147
 
148
+ end # if (fileVersion<14) #版本号过小
149
+ end # def exuz(rootPath)
150
+ end # class ExtremeUnZip
@@ -1,191 +1,188 @@
1
1
  #!/usr/bin/ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'victoriafresh'
4
- require 'cbor'
5
- require 'lzma'
6
- require 'etc' #cpu amount
7
- require 'cod'
5
+ require 'cbor' # CBOR
6
+ require 'lzma' # LZMA
7
+ require 'etc' # cpu amount
8
+ require 'cod'
8
9
  require 'uuid'
9
10
  require 'get_process_mem'
10
11
 
11
12
  def checkMemoryUsage(lineNumber)
12
- mem= GetProcessMem.new
13
-
14
- puts("#{lineNumber} , Memory: #{mem.mb}"); #Debug
15
-
16
- end #def checkMemoryUsage
13
+ mem = GetProcessMem.new
17
14
 
15
+ puts("#{lineNumber} , Memory: #{mem.mb}, process id: #{Process.pid}"); # Debug
16
+ end # def checkMemoryUsage
18
17
 
19
18
  class ExtremeZip
20
- #压缩
19
+ def initialize
20
+ @wholeCbor = {} # 整个CBOR结构
21
+ @vfsDataList = [] # 数据块压缩块列表
22
+ @filePartCounter = 0 # 文件分块计数器
23
+ @responsePipeList = [] # 任务回复管道列表
24
+ @processIdList = [] # 子进程编号列表。
25
+
26
+ @maxSubProcessAmount = Etc.nprocessors # 获取最大的子进程个数
27
+
28
+ @dataBlockLength = 33554432 # 数据块单元长度, 32MiB
29
+
30
+ @clipDownloader = VictoriaFresh.new # 创建下载器。
31
+
32
+ @clipDownloader.diskFlush = true # 向磁盘写入缓存
33
+ @clipDownloader.diskMultiFile = true # 写多个磁盘文件
34
+ @clipDownloader.diskFileName = 'victoriafreshdata.v.' # 磁盘文件名前缀
35
+ @clipDownloader.diskFlushSize = @dataBlockLength # 磁盘文件大小
36
+ end # def initialize
37
+
38
+ # 压缩目录数据。
39
+ def compressVfsMenu(victoriaFresh)
40
+ replyByteArray = victoriaFresh.to_cbor # #打包成字节数组。
41
+
42
+ # 压缩目录数据并放入CBOR:
43
+ compressedVfsMenu = LZMA.compress(replyByteArray) # 压缩目录数据
44
+
45
+ @wholeCbor['vfsMenu'] = compressedVfsMenu # 加入目录
46
+ end # compressVfsMenu(victoriaFresh) # 压缩目录数据。
47
+
48
+ # 加入基本文件信息
49
+ def addBasicFileInformation
50
+ @wholeCbor['version'] = 68 # 文件格式版本号
51
+
52
+ uuid = UUID.new # 获取生成器
53
+ @wholeCbor['uuid'] = uuid.generate # 指定本个压缩包的唯一编号
54
+ end # addBasicFileInformation # 加入基本文件信息
55
+
56
+ # 压缩
21
57
  def exz(rootPath)
22
- #计算一个合理的数据块长度:
23
- # dataBlockLength=16777216 #数据块单元长度, 16MiB
24
- dataBlockLength=33554432 #数据块单元长度, 32MiB
25
- # dataBlockLength=67108864 #数据块单元长度, 64MiB
26
-
27
- checkMemoryUsage(75)
28
-
29
- # dynamicBlockLength=victoriaFreshData.bytesize / Etc.nprocessors + 1 #尝试根据现在的任务计算出一个动态块长度。
30
- dynamicBlockLength=dataBlockLength #尝试根据现在的任务计算出一个动态块长度。
31
-
32
-
33
- checkMemoryUsage(80)
34
-
35
- maxAcceptableDataBlockLength=52852*1024 #Max acceptable data block length
36
-
37
- dataBlockLength=[dataBlockLength, dynamicBlockLength].max #取预定义的块长度和动态块长度中较大的那个来作为块长度。这样压缩比高一些
38
- checkMemoryUsage(85)
39
-
40
- dataBlockLength=[dataBlockLength, maxAcceptableDataBlockLength].min #Limit data block length, not to exceed max acceptable data block length.
41
-
42
- puts("block length: #{dataBlockLength}") #Debug
43
-
44
-
45
- $clipDownloader=VictoriaFresh.new #创建下载器。
46
-
47
- $clipDownloader.diskFlush=true #向磁盘写入缓存
48
- $clipDownloader.diskMultiFile=true #写多个磁盘文件
49
- $clipDownloader.diskFileName='victoriafreshdata.v.' #磁盘文件名前缀
50
- $clipDownloader.diskFlushSize=dataBlockLength #磁盘文件大小
51
-
52
-
53
- checkMemoryUsage(25)
54
- victoriaFresh,victoriaFreshData=$clipDownloader.checkOnce(rootPath) #打包该目录树。
55
-
56
- #利用protobuf打包成字节数组:
57
- replyByteArray="" #回复时使用的字节数组。
58
- checkMemoryUsage(30)
59
- replyByteArray=victoriaFresh.to_cbor ##打包成字节数组。
60
-
61
- checkMemoryUsage(35)
62
- #victoriaFreshFile=File.new("victoriafresh.v","wb") #创建文件。
63
- #victoriaFreshFile.syswrite(replyByteArray) #写入文件。
64
-
65
- #victoriaFreshFile.close #关闭文件。
66
- checkMemoryUsage(40)
67
-
68
- # victoriaFreshDataFile=File.new("victoriafreshdata.v","wb") #数据文件。
69
- # victoriaFreshDataFile.syswrite(victoriaFreshData) #写入文件。
70
- # victoriaFreshDataFile.close #关闭文件。
71
- checkMemoryUsage(45)
72
-
73
-
74
- wholeFileContent='' #最终文件内容
75
-
76
- checkMemoryUsage(50)
77
- wholeFileContent = wholeFileContent + 'exz' + "\0" #写入魔法文件头
78
-
79
- wholeCbor={} #整个CBOR结构
80
- wholeCbor['version']=68 #文件格式版本号
81
- checkMemoryUsage(55)
82
-
83
- uuid = UUID.new #获取生成器
84
- generatedUuid=uuid.generate #生成唯一标识
85
- wholeCbor['uuid']=generatedUuid #指定本个压缩包的唯一编号
86
- checkMemoryUsage(60)
87
-
88
- #压缩目录数据并放入CBOR:
89
- compressedVfsMenu = LZMA.compress(replyByteArray) #压缩目录数据
90
-
91
- checkMemoryUsage(65)
92
- puts("compressed menu length: #{compressedVfsMenu.bytesize}") #Debug.
93
- wholeCbor['vfsMenu']=compressedVfsMenu #加入目录
94
-
95
- #压缩文件实体数据并放入CBOR:
96
- checkMemoryUsage(70)
97
-
98
- checkMemoryUsage(90)
99
-
100
-
101
- processDataLength=0 #已处理的数据长度
102
-
103
- checkMemoryUsage(95)
104
- vfsDataList=[] #数据块压缩块列表
105
- taskPipeList=[] #任务分配管道列表。
106
- responsePipeList=[] #任务回复管道列表
107
- processIdList = [] #记录到子进程列表中
108
- checkMemoryUsage(100)
109
-
110
- filePartAmount=$clipDownloader.currentDiskFlushSuffix #获取文件个数
111
-
112
- filePartCounter=0 #文件计数器
113
-
114
- while (filePartCounter < filePartAmount) #未处理完毕
115
- currentBlockFile=File.new($clipDownloader.diskFileName+filePartCounter.to_s, 'rb') #打开文件
116
-
117
- currentBlockData=currentBlockFile.read #读取全部内容
118
-
119
- currentBlockFile.close #关闭文件
120
-
121
- File.delete(currentBlockFile) #删除数据块文件
122
-
123
- currentTaskPipe=Cod.pipe #任务分配管道
124
- currentResponsePipe=Cod.pipe #任务回复管道
125
-
126
- #记录管道:
127
- taskPipeList << currentTaskPipe
128
- responsePipeList << currentResponsePipe
129
- p1 = fork do #复制出子进程
130
- checkMemoryUsage(115)
131
- currentBlockDataToCompress=currentBlockData #读取数据块
132
-
133
- currentCompressedVfsData=LZMA.compress(currentBlockDataToCompress) #压缩当前块
134
-
135
- checkMemoryUsage(120)
136
- puts("compressed data length: #{currentCompressedVfsData.bytesize}") #Debug.
137
-
138
- currentResponsePipe.put currentCompressedVfsData #将压缩后的数据块写入到回复管道中
139
-
140
- checkMemoryUsage(125)
141
- puts("finished #{Process.pid}") #Debug
142
- end #p1 = fork do #复制出子进程
143
-
144
- processDataLength=processDataLength + dataBlockLength #计数
145
- checkMemoryUsage(130)
146
-
147
- processIdList << p1 #记录到子进程列表中
148
-
149
- filePartCounter=filePartCounter+1 #计数
150
- end #while processDataLength < victoriaFreshData.byte_size do #未处理完毕
151
-
152
- checkMemoryUsage(135)
153
- processCounter=0 #子进程计数器
154
-
155
- processIdList.each do |currentSubProcess|
156
- puts("waiting #{currentSubProcess}") #Debug
157
- checkMemoryUsage(140)
158
-
159
- currentResponsePipe=responsePipeList[processCounter] #任务回复管道
160
-
161
- currentCompressedVfsDataFromSubProcess=currentResponsePipe.get #读取压缩后数据
162
- checkMemoryUsage(145)
163
-
164
- Process.waitpid(currentSubProcess) #等待该个子进程
165
-
166
- vfsDataList << currentCompressedVfsDataFromSubProcess #加入数据块列表中
167
- checkMemoryUsage(150)
168
-
169
- processCounter=processCounter+1 #子进程计数
170
- end #processIdList.each do |currentSubProcess|
171
-
172
- checkMemoryUsage(155)
173
- wholeCbor['vfsDataList']=vfsDataList #加入数据
174
-
175
- #序列化CBOR:
176
- wholeCborByteArray=wholeCbor.to_cbor
177
- checkMemoryUsage(160)
178
-
179
- wholeFileContent = wholeFileContent + wholeCborByteArray
180
-
181
- #写入文件:
182
- checkMemoryUsage(165)
183
- extremeZipOutputFile=File.new( victoriaFresh['name'] + '.exz', 'wb') #创建文件
184
- extremeZipOutputFile.syswrite(wholeFileContent) #写入文件
185
- extremeZipOutputFile.close #关闭文件
58
+ victoriaFresh, = @clipDownloader.checkOnce(rootPath) # 打包该目录树。
186
59
 
60
+ @filePartAmount = @clipDownloader.currentDiskFlushSuffix # 获取文件个数
61
+
62
+ compressVfsMenu(victoriaFresh) # 压缩目录数据。
63
+
64
+ addBasicFileInformation # 加入基本文件信息
65
+
66
+ processIdList, responsePipeList = launchSubProcesses # 启动子进程。
67
+
68
+ receiveCompressedVfsDataList(processIdList, responsePipeList) # 接收压缩后的数据块列表
69
+
70
+ checkMemoryUsage(155)
71
+ @wholeCbor['vfsDataList'] = @vfsDataList # 加入数据
72
+
73
+ wholeFileContent = 'exz' + "\0" + @wholeCbor.to_cbor # 追加CBOR字节数组
74
+
75
+ # 写入文件:
76
+ writeFile(wholeFileContent, victoriaFresh) # 写入文件内容
77
+ end # def exz(rootPath)
78
+
79
+ # 写入文件内容
80
+ def writeFile(wholeFileContent, victoriaFresh)
81
+ extremeZipOutputFile = File.new("#{victoriaFresh['name']}.exz", 'wb') # 创建文件
82
+ extremeZipOutputFile.syswrite(wholeFileContent) # 写入文件
83
+ extremeZipOutputFile.close # 关闭文件
84
+ end # writeFile(wholeFileContent, victoriaFresh) #写入文件内容
85
+
86
+ # 接收压缩后的数据块列表
87
+ def receiveCompressedVfsDataList(processIdList, responsePipeList)
88
+ processCounter = 0 # 子进程计数器
187
89
 
188
-
189
- end #def exz(rootPath)
190
- end #class ExtremeZip
90
+ while (processCounter<@filePartAmount) # 并不是所有分块都被处理完毕了。
91
+ currentSubProcess=processIdList[processCounter] # 获取子进程对象
92
+ #processIdList.each do |currentSubProcess|
93
+ compressed = receiveFromSubProcess(currentSubProcess, responsePipeList, processCounter) # 从子进程中读取数据,并终止子进程
94
+
95
+ @vfsDataList << compressed # 加入数据块列表中
96
+ checkMemoryUsage(150)
97
+
98
+ processCounter += 1 # 子进程计数
99
+
100
+ if (@filePartCounter<@filePartAmount) # 还有一些分块尚未交给子进程进行处理
101
+ schedule1Block(@filePartCounter) # 再启动一个子进程
102
+ end # if (@filePartCounter<@filePartAmount) # 还有一些分块尚未交给子进程进行处理
103
+ end # processIdList.each do |currentSubProcess|
104
+ end # receiveCompressedVfsDataList # 接收压缩后的数据块列表
105
+
106
+ # 读取块文件内容
107
+ def readBlockFile(filePartCounter)
108
+ currentBlockFile = File.new(@clipDownloader.diskFileName + filePartCounter.to_s, 'rb') # 打开文件
109
+
110
+ currentBlockData = currentBlockFile.read # 读取全部内容
111
+
112
+ currentBlockFile.close # 关闭文件
113
+
114
+ File.delete(currentBlockFile) # 删除数据块文件
115
+
116
+ currentBlockData
117
+ end
118
+
119
+ # 计划一个块的压缩计算
120
+ def schedule1Block(filePartCounter)
121
+ currentBlockData = readBlockFile(filePartCounter) # 读取块文件内容
122
+
123
+ # currentTaskPipe = Cod.pipe # 任务分配管道
124
+ currentResponsePipe = Cod.pipe # 任务回复管道
125
+
126
+ puts("forking sub process, file part counter: #{filePartCounter}") # Debug.
127
+
128
+ p1 = fork do # 复制出子进程
129
+ compressInSubProcess(currentBlockData, currentResponsePipe) # 在子进程中具体执行的压缩代码
130
+ end # p1 = fork do #复制出子进程
131
+
132
+ # processDataLength += @dataBlockLength # 计数
133
+ checkMemoryUsage(130)
134
+
135
+ # 记录管道:
136
+ # taskPipeList << currentTaskPipe
137
+ @responsePipeList << currentResponsePipe # 记录回复管道
138
+
139
+ @processIdList << p1 # 记录到子进程列表中
140
+
141
+ @filePartCounter += 1 # 计数
142
+
143
+ [currentResponsePipe, p1]
144
+ end # schedule1Block(filePartCounter) # 计划一个块的压缩计算
145
+
146
+ # 启动子进程。
147
+ def launchSubProcesses
148
+
149
+ #while ((@filePartCounter < @filePartAmount) && (true)) # 未处理完毕,并且未达到最大子进程个数
150
+ while ((@filePartCounter < @filePartAmount) && (@filePartCounter<@maxSubProcessAmount)) # 未处理完毕,并且未达到最大子进程个数
151
+ currentResponsePipe, p1 = schedule1Block(@filePartCounter) # 计划一个块的压缩计算
152
+
153
+ end # while processDataLength < victoriaFreshData.byte_size do #未处理完毕
154
+
155
+ [@processIdList, @responsePipeList]
156
+ end # launchSubProcesses # 启动子进程。
157
+
158
+ # 在子进程中具体执行的压缩代码
159
+ def compressInSubProcess(currentBlockData, currentResponsePipe)
160
+ checkMemoryUsage(115) # Debug
161
+ currentBlockDataToCompress = currentBlockData # 读取数据块
162
+
163
+ currentCompressedVfsData = LZMA.compress(currentBlockDataToCompress) # 压缩当前块
164
+
165
+ checkMemoryUsage(120)
166
+ puts("compressed data length: #{currentCompressedVfsData.bytesize}") # Debug.
167
+
168
+ currentResponsePipe.put currentCompressedVfsData # 将压缩后的数据块写入到回复管道中
169
+
170
+ checkMemoryUsage(125)
171
+ puts("finished #{Process.pid}") # Debug
172
+ end # compressInSubProcess(currentBlockData, currentResponsePipe) # 在子进程中具体执行的压缩代码
173
+
174
+ # 从子进程中读取数据,并终止子进程
175
+ def receiveFromSubProcess(currentSubProcess, responsePipeList, processCounter)
176
+ puts("waiting #{currentSubProcess}") # Debug
177
+ checkMemoryUsage(140)
178
+
179
+ currentResponsePipe = responsePipeList[processCounter] # 任务回复管道
180
+
181
+ currentCompressedVfsDataFromSubProcess = currentResponsePipe.get # 读取压缩后数据
182
+ checkMemoryUsage(145)
183
+
184
+ Process.waitpid(currentSubProcess) # 等待该个子进程
191
185
 
186
+ currentCompressedVfsDataFromSubProcess
187
+ end # receiveFromSubProcess(currentSubProcess) # 从子进程中读取数据,并终止子进程
188
+ end # class ExtremeZip
metadata CHANGED
@@ -1,91 +1,85 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: EXtremeZip
3
3
  version: !ruby/object:Gem::Version
4
- version: 2021.6.10
4
+ version: 2021.7.30
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hxcan Cai
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-10 00:00:00.000000000 Z
11
+ date: 2021-07-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: VictoriaFreSh
14
+ name: cod
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: 2021.5.28
20
17
  - - ">="
21
18
  - !ruby/object:Gem::Version
22
- version: 2021.5.28
19
+ version: 0.6.0
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
- - - "~>"
28
- - !ruby/object:Gem::Version
29
- version: 2021.5.28
30
24
  - - ">="
31
25
  - !ruby/object:Gem::Version
32
- version: 2021.5.28
26
+ version: 0.6.0
33
27
  - !ruby/object:Gem::Dependency
34
- name: ruby-lzma
28
+ name: get_process_mem
35
29
  requirement: !ruby/object:Gem::Requirement
36
30
  requirements:
37
31
  - - ">="
38
32
  - !ruby/object:Gem::Version
39
- version: 0.4.3
33
+ version: 0.2.7
40
34
  type: :runtime
41
35
  prerelease: false
42
36
  version_requirements: !ruby/object:Gem::Requirement
43
37
  requirements:
44
38
  - - ">="
45
39
  - !ruby/object:Gem::Version
46
- version: 0.4.3
40
+ version: 0.2.7
47
41
  - !ruby/object:Gem::Dependency
48
- name: get_process_mem
42
+ name: ruby-lzma
49
43
  requirement: !ruby/object:Gem::Requirement
50
44
  requirements:
51
45
  - - ">="
52
46
  - !ruby/object:Gem::Version
53
- version: 0.2.7
47
+ version: 0.4.3
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
51
  requirements:
58
52
  - - ">="
59
53
  - !ruby/object:Gem::Version
60
- version: 0.2.7
54
+ version: 0.4.3
61
55
  - !ruby/object:Gem::Dependency
62
- name: cod
56
+ name: uuid
63
57
  requirement: !ruby/object:Gem::Requirement
64
58
  requirements:
65
59
  - - ">="
66
60
  - !ruby/object:Gem::Version
67
- version: 0.6.0
61
+ version: 2.3.9
68
62
  type: :runtime
69
63
  prerelease: false
70
64
  version_requirements: !ruby/object:Gem::Requirement
71
65
  requirements:
72
66
  - - ">="
73
67
  - !ruby/object:Gem::Version
74
- version: 0.6.0
68
+ version: 2.3.9
75
69
  - !ruby/object:Gem::Dependency
76
- name: uuid
70
+ name: VictoriaFreSh
77
71
  requirement: !ruby/object:Gem::Requirement
78
72
  requirements:
79
73
  - - ">="
80
74
  - !ruby/object:Gem::Version
81
- version: 2.3.9
75
+ version: 2021.7.27
82
76
  type: :runtime
83
77
  prerelease: false
84
78
  version_requirements: !ruby/object:Gem::Requirement
85
79
  requirements:
86
80
  - - ">="
87
81
  - !ruby/object:Gem::Version
88
- version: 2.3.9
82
+ version: 2021.7.27
89
83
  description: Extreme zip.
90
84
  email: caihuosheng@gmail.com
91
85
  executables:
@@ -102,7 +96,7 @@ homepage: http://rubygems.org/gems/EXtremeZip
102
96
  licenses:
103
97
  - MIT
104
98
  metadata: {}
105
- post_install_message:
99
+ post_install_message:
106
100
  rdoc_options: []
107
101
  require_paths:
108
102
  - lib
@@ -117,8 +111,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
117
111
  - !ruby/object:Gem::Version
118
112
  version: '0'
119
113
  requirements: []
120
- rubygems_version: 3.2.15
121
- signing_key:
114
+ rubygems_version: 3.0.3
115
+ signing_key:
122
116
  specification_version: 4
123
117
  summary: EXtremeZip
124
118
  test_files: []