VictoriaFreSh 2020.10.31 → 2021.4.17

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3e3f7b0d2274b3e4d1053b1ea06d25d0136a9d4cf877a76dd802c4ea89d0b1b7
4
- data.tar.gz: c3723184467e8e953fcd01cacb7c02a7cc1c77a43f1cf7bfe47b81ad41d8ca3e
3
+ metadata.gz: 2c90c85569d4f2c8396f17754e03eb87e35c272b015397983c2afa9af9492ccf
4
+ data.tar.gz: e88f1ac7afb0ab584ed2973fcceec8701f379c0e5e7f0a22e3be07569799c63c
5
5
  SHA512:
6
- metadata.gz: 27ffe0e19351ed1e013465dde4cf4c1adbe16ccef807319feea079880c7f0827bc460ec6e5f6d8d90c261189796e9aae48ab9cd4c9bfc033c79c0b774640480c
7
- data.tar.gz: b03f697db6128b7d582d3c491c67d0c3950d7a8937b8562e5e1510170ba41d5115017aedee13eeaa574ef50d3e49558864cb87f6d4cae87138f824da472dc71b
6
+ metadata.gz: 130b068d432a0199bab6ab093619e4c0e56f31a5437115138a767e719f62083fe07c45abd6cbb5f90661a99122ffa3a8efea57e815c42ccf007ecf7bc5b64e9a
7
+ data.tar.gz: 3c25711cbca993d774d5581f507c7087951304fcb3ae5dfb971ce0cfc93f58b7364c28108e56be3976dffd884d9f7d68dbd9290967fe3293954f03e095bca05c
data/lib/victoriafresh.rb CHANGED
@@ -3,10 +3,34 @@
3
3
  require 'pathname'
4
4
  require 'fileutils'
5
5
  require 'cbor'
6
+ require 'get_process_mem'
6
7
 
7
8
  # require File.dirname(__FILE__)+'/VictoriaFreSh/filemessage_pb.rb'
8
9
 
9
10
  class VictoriaFresh
11
+ attr_accessor :diskFlushSize #累积了这么多的数据就向磁盘写入,以减少内存占用
12
+ attr_accessor :diskFileName #向磁盘写入数据时的文件名或前缀
13
+ attr_accessor :diskMultiFile #向磁盘写入时,是否要写多个文件
14
+ attr_accessor :diskFlush #要提前磁盘写入文件,以节省内存吗?
15
+
16
+ def initialize
17
+ @diskFlush=false #要向磁盘写入文件
18
+ @diskFlushSize=143212 #磁盘分块大小
19
+ @diskFileName='victoriafreshdata.v' #磁盘文件名
20
+ @diskMultiFile=false #磁盘整个文件,不是多个文件
21
+ @diskWriteFileObject={} #向磁盘写入文件的对象
22
+ @contentString="" #内容字符串
23
+ @contentPartArray=[] #内容片段数组
24
+ end
25
+
26
+ def checkMemoryUsage(lineNumber)
27
+ mem= GetProcessMem.new
28
+
29
+ puts("#{lineNumber} , Memory: #{mem.mb}"); #Debug
30
+
31
+ end #def checkMemoryUsage
32
+
33
+
10
34
  def releaseFiles(victoriaFreshPackagedFileString, contentString) #释放目录树
11
35
  # packagedFile=Com::Stupidbeauty::Victoriafresh::FileMessage.decode(victoriaFreshPackagedFileString) #解码文件消息对象。
12
36
  packagedFile=CBOR.decode(victoriaFreshPackagedFileString) #解码
@@ -88,8 +112,6 @@ class VictoriaFresh
88
112
 
89
113
 
90
114
  # puts 'mkdir' #Debug
91
-
92
- # pathToMake=File.join(pathPrefix, packagedFile.name)
93
115
  pathToMake=File.join(pathPrefix, packagedFile['name'])
94
116
 
95
117
  # puts pathToMake #Debug.
@@ -129,7 +151,68 @@ class VictoriaFresh
129
151
  end #if packagedFile.is_file #是文件,则直接写入文件
130
152
  end #def releaseFile(packagedFile, contentString) #释放一个文件
131
153
 
132
- def checkOnce(directoryPath,startIndex=0) #打包一个目录树。
154
+ #考虑是否要向磁盘先输出内容
155
+ def assessDiskFlush(layer, isFinalPart=false)
156
+ # contentString=contentStringInput #要处理的内容字符串
157
+
158
+ # if (layer==0) #是最外层
159
+ while (@contentString.length >= @diskFlushSize) #还有内容要写入
160
+ contentToWrite=@contentString[0, @diskFlushSize] #取出开头的一段
161
+
162
+
163
+
164
+ @contentString=@contentString[@diskFlushSize, @contentString.length-@diskFlushSize] #留下剩余的部分
165
+
166
+ if (@diskFlush) #要向磁盘写入内容
167
+
168
+ @diskWriteFileObject.syswrite(contentToWrite) #写入内容
169
+
170
+ @diskWriteFileObject.flush #写入磁盘
171
+
172
+ else #不向磁盘写入内容
173
+ @contentPartArray << contentToWrite #记录到数组中
174
+
175
+ end #if (@diskFlush) #要向磁盘写入内容
176
+ end #while (contentString.length >= @diskFlushSize) #还有内容要写入
177
+
178
+ if (isFinalPart) #是最后一部分
179
+ contentToWrite=@contentString #要写入的内容
180
+
181
+ # @contentPartArray << contentToWrite #记录到数组中
182
+
183
+ @contentString="" #字符串清空
184
+
185
+ if (@diskFlush) #要向磁盘写入内容
186
+
187
+ @diskWriteFileObject.syswrite(contentToWrite) #写入内容
188
+
189
+ @diskWriteFileObject.close #关闭文件
190
+ else #不向磁盘写入内容
191
+ @contentPartArray << contentToWrite #记录到数组中
192
+
193
+
194
+ end #if (@diskFlush) #要向磁盘写入内容
195
+
196
+ end #if (isFinalPart) #是最后一部分
197
+ # end #if (layer==0) #是最外层
198
+
199
+ # end #if (@diskFlush) #要向磁盘写入内容
200
+
201
+ return @contentString #返回内容
202
+ end #contentString= assessDiskFlush(contentString) #考虑是否要向磁盘先输出内容
203
+
204
+ def checkOnce(directoryPath, startIndex=0, layer=0) #打包一个目录树。
205
+ if (@diskFlush) #要向磁盘写入文件
206
+
207
+ if (layer==0) #最外层
208
+ if (@diskMultiFile) #要写多个文件
209
+ else #不写多个文件
210
+ @diskWriteFileObject=File.new(@diskFileName, 'wb') #打开文件
211
+ end #if (@diskMultiFile) #要写多个文件
212
+ end #if (layer==0) #最外层
213
+
214
+ end #if (@diskFlush) #要向磁盘写入文件s
215
+
133
216
  packagedFile={} #创建文件消息对象。
134
217
 
135
218
  packagedFile['sub_files'] = [] #加入到子文件列表中。
@@ -162,55 +245,79 @@ class VictoriaFresh
162
245
  rescue Errno::ENOENT
163
246
  rescue Errno::EACCES #权限受限
164
247
  end #begin #读取时间戳
165
-
248
+
166
249
  if (isFile) #是文件,不用再列出其子文件了。
167
250
  packagedFile['file_length']=directoryPathName.size #记录文件的内容长度。
168
251
 
169
252
  #读取文件内容:
170
253
  fileToReadContent=File.new(directoryPath,"rb") #创建文件。
171
- contentString=fileToReadContent.read #全部读取。
254
+ @contentString= @contentString + fileToReadContent.read #全部读取。
172
255
 
173
- # puts("encoding: #{contentString.encoding}") #Debug.
256
+ assessDiskFlush(layer) #考虑是否要向磁盘先输出内容
174
257
  elsif (isSymLink) #是符号链接
175
- # puts("sub file: #{directoryPathName}, class: #{directoryPathName.class}, symlink: #{directoryPathName.symlink?}, expand_path: #{directoryPathName.expand_path}, file?: #{directoryPathName.file?}, read link: #{directoryPathName.readlink}") #Debug.
176
-
177
258
  linkTarget=directoryPathName.readlink #获取链接目标
178
259
 
179
260
  # 待续,设置内容长度。符号链接字符串的长度
180
261
  packagedFile['file_length']=linkTarget.to_s.bytesize #记录文件的内容长度。
181
-
262
+
182
263
  #读取文件内容:
183
264
  # fileToReadContent=File.new(directoryPath,"rb") #创建文件。
184
- contentString=StringIO.new(linkTarget.to_s).binmode.read #全部读取。
185
- # contentString=linkTarget.to_s.encode('UTF-8') #全部读取。
186
- puts("encoding: #{contentString.encoding}") #Debug.
187
- puts("content string: #{contentString}") #Debug
265
+ @contentString= @contentString + StringIO.new(linkTarget.to_s).binmode.read #全部读取。
266
+
267
+ assessDiskFlush(layer) #考虑是否要向磁盘先输出内容
268
+
188
269
  else #是目录。
189
- contentString="" #容纳内容的字符串。
270
+ # contentString="" #容纳内容的字符串。
190
271
  subFileStartIndex=startIndex #子文件的起始位置,以此目录的起始位置为基准。
191
272
 
192
- # packagedFile.file_length=0 #本目录的内容长度。
193
273
  packagedFile['file_length']=0 #本目录的内容长度。
194
274
 
195
275
  directoryPathName.each_child do |subFile| #一个个文件地处理。
196
276
  # puts("sub file: #{subFile}, class: #{subFile.class}, symlink: #{subFile.symlink?}, expand_path: #{subFile.expand_path}, file?: #{subFile.file?}") #Debug.
277
+ # checkMemoryUsage(221)
197
278
  realPath=subFile.expand_path #获取绝对路径。
198
279
 
199
- packagedSubFile,subFileContent=checkOnce(realPath,subFileStartIndex) #打包这个子文件。
280
+ packagedSubFile,subFileContent=checkOnce(realPath,subFileStartIndex, layer+1) #打包这个子文件。
200
281
 
201
282
  packagedFile['sub_files'] << packagedSubFile #加入到子文件列表中。
202
283
 
203
- # puts("sub file content: #{subFileContent}") #Debug
284
+ # puts("sub file content: #{subFileContent}, nil?: #{subFileContent.nil?}" ) #Debug
204
285
 
205
- contentString = contentString + subFileContent #串接文件内容。
286
+ # puts(" content: #{contentString}, nil?: #{contentString.nil? }") #Debug
287
+
288
+ # contentString = contentString + subFileContent #串接文件内容。
289
+
290
+ assessDiskFlush(layer) #考虑是否要向磁盘先输出内容
291
+
206
292
 
207
293
  subFileStartIndex+=packagedSubFile['file_length'] #记录打包的子文件的长度,更新下一个要打包的子文件的起始位置。
208
294
 
295
+ # puts("237, content string length: #{contentString.length}") #Debug
296
+
209
297
  packagedFile['file_length']+=packagedSubFile['file_length'] #随着子文件的打包而更新本目录的总长度。
210
298
  end #directoryPathName.each_child do |subFile| #一个个文件地处理。
211
299
  end #if (isFile) #是文件,不用再列出其子文件了。
212
300
 
213
- return packagedFile,contentString #返回打包之后的对象。和文件内容字节数组。
301
+ # puts("300, contentString: #{contentString}, nil?: #{contentString.nil?}, direcotry path: #{directoryPath}, layer: #{layer}") #Debug
302
+
303
+
304
+ # puts("302, contentString: #{contentString}, nil?: #{contentString.nil?}, direcotry path: #{directoryPath}, layer: #{layer}") #Debug
305
+
306
+ contentToResult="" #要返回的内容
307
+
308
+ if (layer==0) #是最外层
309
+ assessDiskFlush(layer, true) #考虑是否要向磁盘先输出内容
310
+
311
+ if (@diskFlush) #要向磁盘写入缓存内容
312
+ else #不向磁盘写入缓存内容
313
+ contentToResult=@contentPartArray.join #重新合并成字符串
314
+
315
+ end #if (@diskFlush) #要向磁盘写入缓存内容
316
+
317
+ end #if (layer==0) #是最外层
318
+
319
+
320
+ return packagedFile, contentToResult #返回打包之后的对象。和文件内容字节数组。
214
321
  end #def downloadOne #下载一个视频。
215
322
  end
216
323
 
@@ -9,6 +9,8 @@ else #指定了命令行参数。
9
9
 
10
10
  $clipDownloader=VictoriaFresh.new #创建下载器。
11
11
 
12
+ $clipDownloader.diskFlush=false #不向磁盘写入缓存
13
+
12
14
  victoriaFresh,victoriaFreshData=$clipDownloader.checkOnce($rootPath) #打包该目录树。
13
15
 
14
16
  #利用protobuf打包成字节数组:
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: VictoriaFreSh
3
3
  version: !ruby/object:Gem::Version
4
- version: 2020.10.31
4
+ version: 2021.4.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hxcan Cai
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-31 00:00:00.000000000 Z
11
+ date: 2021-04-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cbor