免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2209 | 回复: 8

pppk之Recipe7.11(1) [复制链接]

论坛徽章:
0
发表于 2012-08-23 20:23 |显示全部楼层
今天我决定说说Recipe7.11,使用临时文件。最近正好用到了这个模块,就说说吧。分两天完成。

今天的引用语是
  1. 康先生之教,特标专精、涉猎二条;无专精则不能成,无涉猎则不能通也    --梁启超
复制代码
这几天的项目有点赶。希望下周好些。

论坛徽章:
0
发表于 2012-08-23 20:29 |显示全部楼层
最近项目里把在数据load进去数据库的时候发现,在小文件很多的时候,性能很不好。但是如果把文件合并到一定的行数,效率比较优。同时由于那些小文件的文件名很重要,而且tracking数据库里也需要存的是那些小文件的文件名。所以这时候,我们就采用把文件合并到一个临时文件里去,在临时文件的loading成功或失败的时候,对原始的小文件进行相应处理。

这就要用到Perl的临时文件模块。这是标准库提供的。
  1. use File::Temp qw( tempfile tempdir );
复制代码
其中我们我们这里会涉及到临时文件和目录的创建。各位视自己的情况来使用。今天先讲讲tempdir

论坛徽章:
0
发表于 2012-08-23 20:36 |显示全部楼层
在Linux下使用tempdir来创建临时目录最简单的方法如下.
  1. # Module File::Temp can support creating temporary files / dirs
  2. # Create temp dir, will not delete it after exit
  3. # Return the dirname
  4. my $sTmpDir = tempdir( );
  5. print "Temporary dir: $sTmpDir\n";
复制代码
这个函数会返回临时目录名的绝对路径。默认情况下,会在/tmp这个Linux默认存放临时文件的目录下生产临时目录。我们可以看到目录名是一串随机的字符串, 诸如
  1. /tmp/5ZaWrFtFtP /tmp/lDZRFGeyOP /tmp/VQkM0C2YUP
复制代码
那这些目录在程序退出后,会不会被删除呢?我实践下来,默认是不会。这和创建临时文件的情况是不一样的。
那如果我们在正式使用的时候希望目录能被删除又如何呢?这里就要使用CLEANUP参数,并将其值赋为1
  1. # Create temp dir, will not delete it after exit
  2. my $sTmpCleanDir = tempdir( CLEANUP => 1 );
  3. print "Temporary dir will be removed: $sTmpCleanDir\n";
复制代码

论坛徽章:
0
发表于 2012-08-23 20:46 |显示全部楼层
刚刚说到了,默认的临时目录是创建在/tmp之上的。但是如果我们希望在指定目录创建临时目录以更好地进行管理,那我们要如何完成呢?

如果你确定要这么做,那要在创建临时文件的时候用DIR参数指定你所需要的路径
  1. # Create temp dir at specific dir and this dir must be created ahead
  2. my $sTestDir = "/tmp/test";
  3. $sTmpDir = tempdir( DIR => $sTestDir );
  4. print "Temporary dir at test dir $sTestDir: [$sTmpDir]\n";
复制代码
但是这里要注意的是,上面DIR对应的路径必须存在,否则创建临时文件就会失败。所以比较保险的方法是用mkpath之类的方法,先确保目标的目录存在。因为临时文件用到的目录本身就有一定的随意性,所以管理起来还是要很小心。

论坛徽章:
0
发表于 2012-08-23 21:01 |显示全部楼层
上文还提到,临时目录的目录名是个随机的字符串。那如果我希望这个目录能有些特征怎么办呢?比如我希望目录里有对应的进程号,或是我希望目录里有明确的名字以区别其他程序产生的临时文件。

这里就要引入一个叫Template的概念。也就说,我们可以对临时目录的名字用Template加以控制。这样创建出来的所有的临时目录或文件都具有Template的pattern

看这句语句,我们这里创建了一个Templae。一个Template由2部分组成,确定性字符串和随机字符串,随机字符串位于目录名的结尾,记住必须是结尾!
  1. my $sDirTemplate = "TestTmpDirXXXX";
复制代码
随机字符串由连续的X字符来表示,必须连续且长度大于等于4。确定星字符串位于随机字符串的前面,你可以用自己希望的模式来指定它。如果你用了变量,注意加大括号,以和后面的随机字符XXXX区别开来。
  1. my $sDirTemplate = "${$}XXXX";  
复制代码
这里就用了进程号做确定性字符串

在确定好模式后,我们要把它传给tempdir来创建临时目录.
  1. # The template must end with at least 4 'X' characters
  2. my $sDirTemplate = "TestTmpDirXXXX";  
  3. $sTmpDir = tempdir( $sDirTemplate, DIR => $sTestDir );

  4. # /tmp/test/TestTmpDirvquC
  5. print "Temporary dir with template at test dir $sTestDir: [$sTmpDir]\n";
复制代码
这里我们可以看到,临时目录的名字是TestTmpDirvquC。的确就是我们希望的。

明天讲临时文件的创建,细节会稍微多一点

论坛徽章:
0
发表于 2012-08-23 21:16 |显示全部楼层
而对于Python来说,主要使用模块tempfile模块来创建临时目录和文件

要创建临时目录,最简单的就是
  1. dname = tempfile.mkdtemp()
复制代码
它同样在/tmp下创建临时目录。但是和Perl不一样的是,它的文件名不是完全随机的。它以tmp开头,后6位随机
  1. '/tmp/tmpLQ3943'
复制代码
如需要指定临时文件创建的位置,则和perl类似,指定dir参数即可比如
  1. dname = tempfile.mkdtemp(dir='/tmp/test')
复制代码
则返回'/tmp/test/tmpFDznqS''

那我们如何指定其Template呢?这一点Python比Perl稍微好些,你可以在随机目录名的前后都加你想要的字符串。用法就是指定prefix和suffix的值
  1. dname = tempfile.mkdtemp(dir='/tmp/test',prefix="PPP_",suffix=".SSS")
复制代码
返回目录名字是/tmp/test/PPP_dd6sxe.SSS

也就是说,中间那6个随机字符串的值你不能控制。而且你不能像Perl那样,改变随机字符串的长度。比如在Perl里你可以这样写Template,"ABCXXXXXXX"。我没测试过X的上限值,但至少是可变的

最后一点,Python告诉我们:
  1.     Caller is responsible for deleting the directory when done with it.
复制代码
看来,就是要让我们自己做主了。好吧。

今天就写到这

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
发表于 2012-08-24 10:41 |显示全部楼层
呵呵,坚持学习...

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2012-08-27 21:06 来自手机 |显示全部楼层
我来催账了啦

论坛徽章:
0
发表于 2012-08-27 21:48 |显示全部楼层
回复 8# zhlong8


    哈哈,我正好在写
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP