EXtremeZip 2021.5.6 → 2021.5.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/extremezip.zzaqsv.rb +198 -0
  3. metadata +3 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6d8b532725ca8997ac89e9e2474d6470519599990f46df267f3d8ee4b947475c
4
- data.tar.gz: 64396057023279e0c32aed5939b4426f993bb22a541ddba869f74eac11390852
3
+ metadata.gz: dff9bb4d48b74cbd2a68b0b4d4c272a3a8eb892583f06405a366ff21c8b1f74b
4
+ data.tar.gz: f237f9506bb0535a1691ff4db701030b9813c8983403675235efd64853c4308d
5
5
  SHA512:
6
- metadata.gz: 2338e30f71b1fb13f66100134196e10bb36ae1469b81b17c6103bf7cadfbc654af57862eb6340c49a6686df96cfde3b75d961c6791a8be3843a697622f49daba
7
- data.tar.gz: 6962e359806dd2e1471a1bafcf5d0f6753ff0d3938950028ffbc29886c8c725cf298c6e68506f0602e935cd445ea26d5774eed5c4f849099285caa5721385ddb
6
+ metadata.gz: 3c64977a4f41409dcd0eaa03d63676825e133bb8140d2abd5101ead37390f86ceaeda8450e204b3d7c166791cfa0d24746c47352d2f1330cb9bd426c2c39a51e
7
+ data.tar.gz: e7924853e2318f6d2aeec49b34480476b51210e0c94b85dd156ff3ba191bac209e239f5b9aec1de27e44f45749c1353fe8d559500f256b07301d213f4fd123b1
@@ -0,0 +1,198 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require 'victoriafresh'
4
+ require 'cbor'
5
+ require 'lzma'
6
+ require 'etc' #cpu amount
7
+ require 'cod'
8
+ require 'uuid'
9
+ require 'get_process_mem'
10
+
11
+ def checkMemoryUsage(lineNumber)
12
+ mem= GetProcessMem.new
13
+
14
+ puts("#{lineNumber} , Memory: #{mem.mb}"); #Debug
15
+
16
+ end #def checkMemoryUsage
17
+
18
+
19
+ class ExtremeZip
20
+ #压缩
21
+ 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
+ # victoriaFresh.encode(replyByteArray) #打包成字节数组。
60
+ # replyByteArray=Com::Stupidbeauty::Victoriafresh::FileMessage.encode(victoriaFresh) ##打包成字节数组。
61
+ replyByteArray=victoriaFresh.to_cbor ##打包成字节数组。
62
+
63
+ checkMemoryUsage(35)
64
+ victoriaFreshFile=File.new("victoriafresh.v","wb") #创建文件。
65
+ victoriaFreshFile.syswrite(replyByteArray) #写入文件。
66
+
67
+ victoriaFreshFile.close #关闭文件。
68
+ checkMemoryUsage(40)
69
+
70
+ # victoriaFreshDataFile=File.new("victoriafreshdata.v","wb") #数据文件。
71
+ # victoriaFreshDataFile.syswrite(victoriaFreshData) #写入文件。
72
+ # victoriaFreshDataFile.close #关闭文件。
73
+ checkMemoryUsage(45)
74
+
75
+
76
+ wholeFileContent='' #最终文件内容
77
+
78
+ checkMemoryUsage(50)
79
+ wholeFileContent = wholeFileContent + 'exz' + "\0" #写入魔法文件头
80
+
81
+ wholeCbor={} #整个CBOR结构
82
+ wholeCbor['version']=68 #文件格式版本号
83
+ checkMemoryUsage(55)
84
+
85
+ uuid = UUID.new #获取生成器
86
+ generatedUuid=uuid.generate #生成唯一标识
87
+ wholeCbor['uuid']=generatedUuid #指定本个压缩包的唯一编号
88
+ checkMemoryUsage(60)
89
+
90
+ #压缩目录数据并放入CBOR:
91
+ compressedVfsMenu = LZMA.compress(replyByteArray) #压缩目录数据
92
+
93
+ checkMemoryUsage(65)
94
+ puts("compressed menu length: #{compressedVfsMenu.bytesize}") #Debug.
95
+ wholeCbor['vfsMenu']=compressedVfsMenu #加入目录
96
+
97
+ #压缩文件实体数据并放入CBOR:
98
+ checkMemoryUsage(70)
99
+
100
+ checkMemoryUsage(90)
101
+
102
+
103
+ processDataLength=0 #已处理的数据长度
104
+
105
+ checkMemoryUsage(95)
106
+ vfsDataList=[] #数据块压缩块列表
107
+ taskPipeList=[] #任务分配管道列表。
108
+ responsePipeList=[] #任务回复管道列表
109
+ processIdList = [] #记录到子进程列表中
110
+ checkMemoryUsage(100)
111
+
112
+ filePartAmount=$clipDownloader.currentDiskFlushSuffix #获取文件个数
113
+
114
+ filePartCounter=0 #文件计数器
115
+
116
+ while (filePartCounter < filePartAmount) #未处理完毕
117
+
118
+ # while processDataLength < victoriaFreshData.bytesize do #未处理完毕
119
+ # currentBlockData=victoriaFreshData[processDataLength, dataBlockLength] #取出当前数据块
120
+
121
+ currentBlockFile=File.new($clipDownloader.diskFileName+filePartCounter.to_s, 'rb') #打开文件
122
+
123
+ currentBlockData=currentBlockFile.read #读取全部内容
124
+
125
+ currentBlockFile.close #关闭文件
126
+
127
+ checkMemoryUsage(105)
128
+ currentTaskPipe=Cod.pipe #任务分配管道
129
+ currentResponsePipe=Cod.pipe #任务回复管道
130
+
131
+ #记录管道:
132
+ checkMemoryUsage(110)
133
+ taskPipeList << currentTaskPipe
134
+ responsePipeList << currentResponsePipe
135
+
136
+ p1 = fork do #复制出子进程
137
+ checkMemoryUsage(115)
138
+ currentBlockDataToCompress=currentBlockData #读取数据块
139
+
140
+ currentCompressedVfsData=LZMA.compress(currentBlockDataToCompress) #压缩当前块
141
+
142
+ checkMemoryUsage(120)
143
+ puts("compressed data length: #{currentCompressedVfsData.bytesize}") #Debug.
144
+
145
+ currentResponsePipe.put currentCompressedVfsData #将压缩后的数据块写入到回复管道中
146
+
147
+ checkMemoryUsage(125)
148
+ puts("finished #{Process.pid}") #Debug
149
+ end #p1 = fork do #复制出子进程
150
+
151
+ processDataLength=processDataLength + dataBlockLength #计数
152
+ checkMemoryUsage(130)
153
+
154
+ processIdList << p1 #记录到子进程列表中
155
+
156
+ filePartCounter=filePartCounter+1 #计数
157
+ end #while processDataLength < victoriaFreshData.byte_size do #未处理完毕
158
+
159
+ checkMemoryUsage(135)
160
+ processCounter=0 #子进程计数器
161
+
162
+ processIdList.each do |currentSubProcess|
163
+ puts("waiting #{currentSubProcess}") #Debug
164
+ checkMemoryUsage(140)
165
+
166
+ currentResponsePipe=responsePipeList[processCounter] #任务回复管道
167
+
168
+ currentCompressedVfsDataFromSubProcess=currentResponsePipe.get #读取压缩后数据
169
+ checkMemoryUsage(145)
170
+
171
+ Process.waitpid(currentSubProcess) #等待该个子进程
172
+
173
+ vfsDataList << currentCompressedVfsDataFromSubProcess #加入数据块列表中
174
+ checkMemoryUsage(150)
175
+
176
+ processCounter=processCounter+1 #子进程计数
177
+ end #processIdList.each do |currentSubProcess|
178
+
179
+ checkMemoryUsage(155)
180
+ wholeCbor['vfsDataList']=vfsDataList #加入数据
181
+
182
+ #序列化CBOR:
183
+ wholeCborByteArray=wholeCbor.to_cbor
184
+ checkMemoryUsage(160)
185
+
186
+ wholeFileContent = wholeFileContent + wholeCborByteArray
187
+
188
+ #写入文件:
189
+ checkMemoryUsage(165)
190
+ extremeZipOutputFile=File.new( victoriaFresh['name'] + '.exz', 'wb') #创建文件
191
+ extremeZipOutputFile.syswrite(wholeFileContent) #写入文件
192
+ extremeZipOutputFile.close #关闭文件
193
+
194
+
195
+
196
+ end #def exz(rootPath)
197
+ end #class ExtremeZip
198
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: EXtremeZip
3
3
  version: !ruby/object:Gem::Version
4
- version: 2021.5.6
4
+ version: 2021.5.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hxcan Cai
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-06 00:00:00.000000000 Z
11
+ date: 2021-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: VictoriaFreSh
@@ -55,6 +55,7 @@ files:
55
55
  - bin/exuz
56
56
  - bin/exz
57
57
  - lib/extremeunzip.zzaqsu.rb
58
+ - lib/extremezip.zzaqsv.rb
58
59
  homepage: http://rubygems.org/gems/EXtremeZip
59
60
  licenses:
60
61
  - MIT