performance - Perl:写入速度之谜?

标签 performance perl hard-drive

输出速率怎么可能高于硬盘写入速率?

更新 1:我更改了以下内容:

  1. 关闭防病毒软件。没有变化。

  2. 插入新的物理磁盘并使用第一个分区 为了测试。 (初始测试的磁盘位于 最后一个分区,与系统分区分开,但是 在同一物理磁盘上。)。结果:有相同的 循环模式,但系统不再 测试期间无响应。写入速度为 稍高一些(可能是由于使用第一个 分区和/或不再干扰系统 分割)。初步结论:存在某种 系统分区的干扰。

  3. 已安装 64 位 Perl。循环消失了 一切在 2 秒时间范围内都很稳定:CPU 利用率为 55% 单核,写入速度约65MB/s。

  4. 在原始驱动器上尝试过 64 位 Perl。结果: 中间某个地方。 8 秒周期,CPU 20-50%, 35 - 65 MB/秒(而不是 0-100% 的深度循环,0 - 120 MB/秒)。系统只是轻微无响应。 写入速度为 50 MB/秒。这支持了干扰理论。

  5. 在 Perl 脚本中刷新。还没试过。

<小时/>

好的,我已经通过了 first hurdle 。我写了一个Perl 可以生成非常大的文本文件(例如 20 GB)的脚本 本质上只是一些:

print NUMBERS_OUTFILE $line;

其中 $line 是一个长字符串,末尾带有“\n”。

当 Perl 脚本启动时,写入速率约为 120 MB/s (与脚本计算的内容一致, Process Explorer和进程 Perl 的“IO 写入字节/秒” 在性能监视器中。)并且单核上的 CPU 为 100% 正在运行。我相信这个速度比 write 还要高 硬盘速度。

一段时间后(例如 20 秒,写入 2.7 GB) 整个系统变得非常无响应,CPU 下降到 0%。这最后例如30秒。平均写入速度 这两个阶段的写入速度是一致的 硬盘。本文提到的时间和尺寸 每次运行的段落差异很大。范围 1 GB 到目前为止,第一阶段已观测到 4.3 GB。 这是transcript for the run with 4.3 GB .

9.2 GB 文本文件有多个这样的循环 测试中生成:

Enter image description here

这是怎么回事?

<小时/>

完整Perl scriptBAT driver script (HTML 格式为 预标记)。如果两个环境变量 MBSIZE 和 OUTFILE 已设置,然后 Perl 脚本应该能够运行 在 Windows 以外的其他平台上保持不变。

平台:ActiveState 的 Perl 5.10.0; (最初是32位,后来是64位); build 1004。 Windows XP x64 SP2,无页面文件,8 GB RAM,AMD 四核 CPU, 500 GB Green Caviar 硬盘(写入速度 85 MB/秒?)。

最佳答案

我和其他人一样认为问题是缓冲区填充然后清空。尝试打开autoflush避免有缓冲区(在 Perl 中):

#!/usr/bin/perl

use strict;
use warnings;

use IO::Handle;

my $filename = "output.txt";

open my $numbers_outfile, ">", $filename
    or die "could not open $filename: $!";

$numbers_outfile->autoflush(1);

#each time through the loop should be 1 gig
for (1 .. 20) {
    #each time though the loop should be 1 meg
    for (1 .. 1024) {
        #print 1 meg of Zs
        print {$numbers_outfile} "Z" x (1024*1024)
    }
}

如果您要打印一点、做一些工作等,缓冲区可能会很好。但如果您只是要将数据写入磁盘,它们可能会导致奇怪的行为。您可能还需要禁用文件系统正在执行的任何写入缓存。

关于performance - Perl:写入速度之谜?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1391015/

相关文章:

perl - 当发生冲突时,这是否保证用 %hash2 覆盖 %hash1 ?

Perl 文件大小限制

C++ - 确保硬盘(驱动器)在程序执行期间不空闲

mysql - MySQL 中多个模式之间的交叉连接。权限和性能

java - 无重复的 k 排序数组的迭代器实现 - 面试问题

java - 解析一行数据: split vs regex

linux - 同时处理多个文件——复制文件还是通过 NFS 读取?

SQL 通配符 : performance overhead?

json - 在 Perl 中使用 JSON::XS::encode_json 将 64 位整数更改为 float

c - 如何在c中获取硬盘信息?