简体   繁体   English

使用Perl的tempfile清理失败

[英]Cleanup failed with tempfile using perl

I needed to use "iconv" to convert char encoding from some files generated on windows. 我需要使用“ iconv”来从Windows上生成的某些文件转换char编码。 Sometimes those files are very big and execution fails because it runs out of RAM. 有时这些文件很大,执行失败,因为它用完了RAM。 Googling i found a script which is called "iconv-chunks.pl" which is basically a perl script which processes the files and works pretty well, but it generates temporary files on my /tmp folder. 在谷歌搜索中,我找到了一个名为“ iconv-chunks.pl”的脚本,该脚本基本上是一个Perl脚本,可以处理文件并运行良好,但是会在我的/ tmp文件夹中生成临时文件。 The problem is that this scripts runs automatically everyday for many files and it keeps generating garbage on my /tmp dir even though it has the cleanup flag ON. 问题在于该脚本每天都会自动运行许多文件,即使清除标志为ON,它也会在我的/ tmp目录中不断生成垃圾。

The script im talking about is: https://code.google.com/p/clschool-team4/source/browse/trunk/iconv-chunks.pl?r=53 我正在谈论的脚本是: https : //code.google.com/p/clschool-team4/source/browse/trunk/iconv-chunks.pl?r=53

#!/usr/bin/perl

our $CHUNK_SIZE = 1024 * 1024 * 100; # 100M

=head1 NAME

iconv-chunks - Process huge files with iconv

=head1 SYNOPSIS

  iconv-chunks <filename> [iconv-options]

=head1 DESCRIPTION

The standard iconv program reads the entire input file into
memory, which doesn't work for large files (such as database exports).

This script is just a wrapper that processes the input file
in manageable chunks and writes it to standard output.

The first argument is the input filename (use - to specify standard input).
Anything else is passed through to iconv.

The real iconv needs to be somewhere in your PATH.

=head1 EXAMPLES

  # Convert latin1 to utf-8:
  ./iconv-chunks database.txt -f latin1 -t utf-8 > out.txt

  # Input filename of - means standard input:
  ./iconv-chunks - -f iso8859-1 -t utf8 < database.txt > out.txt

  # More complex example, using compressed input/output to minimize disk use:
  zcat database.txt.gz | ./iconv-chunks - -f iso8859-1 -t utf8 | \
  gzip - > database-utf.dump.gz

=head1 AUTHOR

Maurice Aubrey <maurice.aubrey+iconv@gmail.com>

=cut

# $Id: iconv-chunks 6 2007-08-20 21:14:55Z mla $

use strict;
use warnings;
use bytes;
use File::Temp qw/ tempfile /;

# iconv errors:
#   iconv: unable to allocate buffer for input: Cannot allocate memory
#   iconv: cannot open input file `database.txt': File too large

@ARGV >= 1 or die "Usage: $0 <inputfile> [iconv-options]\n";
my @options = splice @ARGV, 1;

my($oh, $tmp) = tempfile(undef, CLEANUP => 1);
# warn "Tempfile: $tmp\n";

my $iconv = "iconv @options $tmp";
sub iconv { system($iconv) == 0 or die "command '$iconv' failed: $!" }

my $size = 0;
# must read by line to ensure we don't split multi-byte character
while (<>) {
  $size += length $_;
  print $oh $_;
  if ($size >= $CHUNK_SIZE) {
    iconv;
    truncate $oh, 0 or die "truncate '$tmp' failed: $!";
    seek $oh, 0, 0 or die "seek on '$tmp' failed: $!";
    $size = 0;
  }
}
iconv if $size > 0;

Any help finding the problem or how can it delete temporary files after finishing? 找到问题的任何帮助,或者完成后如何删除临时文件?

Regards 问候

Change 更改

my($oh, $tmp) = tempfile(undef, CLEANUP => 1);

to

my($oh, $tmp) = tempfile(UNLINK => 1);

CLEANUP is used to trigger removal of temporary directories on exit, not files. CLEANUP用于在退出时触发删除临时目录 ,而不是文件。 Note that passing undef as the first argument in order to use the default template is unnecessary. 注意,不必使用undef作为第一个参数来使用默认模板。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM