hello everyone~
my writegz.cr is this:
require "gzip"
maxnum = ARGV[0].to_i
rep = ARGV[1].to_i
line = ARGV[2].to_s * rep
File.open("file.txt.gz", "w") do |f|
Gzip::Writer.open(f) do |gfile|
while maxnum > 0
gfile.puts(line)
maxnum -=1
end
end
end
puts "write done"
After crystal build writegz.cr --release
,
then run ./writegz 2741990 1000 A >/dev/null
get error:
Unhandled exception: Arithmetic overflow (OverflowError)
from ???
from /usr/share/crystal/src/gzip/writer.cr:0:0 in 'write'
from /usr/share/crystal/src/string.cr:4117:5 in '__crystal_main'
from /usr/share/crystal/src/crystal/main.cr:47:14 in 'main'
from __libc_start_main
from ???
from ???
then run ./writegz 2741990 10 A >/dev/null
get no error.
then run ./writegz 1741990 1000 A >/dev/null
get no error
when build crystal build writegz.cr --error-trace --debug
, then run ./writegz 2741990 1000 A >/dev/null
get detail error:
Unhandled exception: Arithmetic overflow (OverflowError)
from /usr/share/crystal/src/gzip/writer.cr:0:12 in 'write'
from /usr/share/crystal/src/io.cr:481:7 in 'write_utf8'
from /usr/share/crystal/src/string.cr:4285:5 in 'to_s'
from /usr/share/crystal/src/io.cr:184:5 in '<<'
from /usr/share/crystal/src/io.cr:227:5 in 'puts'
from writegz.cr:11:4 in '__crystal_main'
from /usr/share/crystal/src/crystal/main.cr:97:5 in 'main_user_code'
from /usr/share/crystal/src/crystal/main.cr:86:7 in 'main'
from /usr/share/crystal/src/crystal/main.cr:106:3 in 'main'
from __libc_start_main
from ???
from ???
$crystal --version
Crystal 0.31.1 [0e2e1d067] (2019-09-30)
LLVM: 8.0.0
Default target: x86_64-unknown-linux-gnu
$cat /etc/centos-release
CentOS Linux release 7.7.1908 (Core)
when Gzip::Reader with big gzip file also get the same error:
Unhandled exception: Arithmetic overflow (OverflowError)
from ???
from /usr/share/crystal/src/gzip/reader.cr:0:0 in 'unbuffered_read'
from /usr/share/crystal/src/io/buffered.cr:215:5 in '__crystal_main'
from /usr/share/crystal/src/crystal/main.cr:47:14 in 'main'
from __libc_start_main
from ???
from ???
the code is:
require "gzip"
ifile = "large.gz" # large.gz is more than 64740990 lines
Gzip::Reader.open(ifile) do |gfile|
gfile.each_line do |gline|
puts gline
end
end
when I use Process.run
with the same big gzip file,get no error! the code is:
ifile = "large.gz" # large.gz is more than 64740990 lines
Process.run("gzip -dc #{ifile}", shell: true) do |proc|
while line = proc.output.gets
puts line
end
end
Thanks~
Regard
Si