0

我真的需要一些帮助。

我们收集引擎数据,这些数据以压缩文件的形式出现,文件名如data_XXXXXX.csv.gz. 压缩后的这些文件大约为 50KB,解压缩后大约为 3.5MB。它们包含大约 7000 行数据,其中每行大约有 240 个值,以“;”分隔。

几行数据如下所示:

2015-04-04 03:03:21;DIG. Engine 1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0
2015-04-04 03:03:21;ANA. Engine 1;1609;0;0;1224;1601;0;0;0;0;260;0;0;0;0;0;0;0;84;0;921;22;28;310;390;364;357;0;289;293;289;289;298;305;298;302;306;297;320;297;314;303;308;301;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;424;372;24;2;0;4;0;2;8;740;432;444;2320;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;2800;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;7;0;0;4;3;2;2;1;2;1;27;380;0;0;0;42717;14;0;0;0;0;0;0;0;0;0;0;5998;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0
2015-04-04 03:03:22;DIG. Engine 2;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0
2015-04-04 03:03:22;ANA. Engine 2;1602;0;0;1012;1602;0;0;0;0;240;0;0;0;0;0;0;0;84;0;933;22;28;283;370;324;332;0;283;293;274;280;298;278;285;285;266;292;289;303;262;275;270;285;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;428;372;26;3;0;4;0;4;22;720;452;444;2288;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;2825;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;7;0;0;4;3;2;2;3;2;1;27;384;0;0;0;44114;14;0;0;0;0;0;0;0;0;0;0;6002;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0
2015-04-04 03:03:22;DIG. Engine 3;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;0;1;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0
2015-04-04 03:03:22;ANA. Engine 3;1516;0;0;324;0;0;0;0;0;170;0;0;0;0;0;0;0;81;24;0;0;11;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;572;492;40;0;0;0;0;125;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;2750;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;414;182;63;82;505;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;7;0;0;4;8;3;4;1;3;1;12;704;0;0;0;22382;4;0;0;0;0;0;0;0;0;0;0;8972;0;0;0;0;0;0;0;0;0;0;0;46679;12;0;0;0;0;0;0;0;0;0;0;0;0;0

通过 Python 脚本,我设法解压缩并编辑文件以在第一列和第二列之间添加一列,使用如下内容:

try:
    for row in reader:
    row.insert(1,InstallationName)
    newdat.append(row)
except:#encountered a .gz file which was unable to be altered. let's prevent that! 
    f.close()
    outfile.close()
else:
    writer.writerows(newdat)
    f.close()
    outfile.close()

完成后,文件将使用 bulkimport 导入 MSSQL 数据库,因此我们确实需要一个干净的 .csv 文件!

输出的一个例子是:

2015-04-04 03:03:21;SOMETEXT;DIG. Engine 1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0
2015-04-04 03:03:21;SOMETEXT;ANA. Engine 1;1609;0;0;1224;1601;0;0;0;0;260;0;0;0;0;0;0;0;84;0;921;22;28;310;390;364;357;0;289;293;289;289;298;305;298;302;306;297;320;297;314;303;308;301;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;424;372;24;2;0;4;0;2;8;740;432;444;2320;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;2800;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;7;0;0;4;3;2;2;1;2;1;27;361;0;0;0;42717;14;0;0;0;0;0;0;0;0;0;0;5998;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0
2015-04-04 03:03:22;SOMETEXT;DIG. Engine 2;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0
2015-04-04 03:03:22;SOMETEXT;ANA. Engine 2;1602;0;0;1012;1602;0;0;0;0;240;0;0;0;0;0;0;0;84;0;933;22;28;283;370;324;332;0;283;293;274;280;298;278;285;285;266;292;289;303;262;275;270;285;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;428;372;26;3;0;4;0;4;22;720;452;444;2288;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;2825;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;7;0;0;4;3;2;2;3;2;1;27;365;0;0;0;44114;14;0;0;0;0;0;0;0;0;0;0;6002;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0
2015-04-04 03:03:22;SOMETEXT;DIG. Engine 3;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;0;1;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0
2015-04-04 03:03:22;SOMETEXT;ANA. Engine 3;1516;0;0;324;0;0;0;0;0;170;0;0;0;0;0;0;0;81;24;0;0;11;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;572;492;40;0;0;0;0;125;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;2750;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;414;182;63;82;505;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;7;0;0;4;8;3;4;1;3;1;12;332;0;0;0;22382;4;0;0;0;0;0;0;0;0;0;0;8972;0;0;0;0;0;0;0;0;0;0;0;46679;12;0;0;0;0;0;0;0;0;0;0;0;0;0

现在这可行,它会按照我想要的方式更改解压缩的 .csv 文件。但有一个缺点。文件的大小与脚本的结合让我很头疼,因为当它在多个文件上运行时,CPU 使用率飙升,服务器无法再跟上。

现在我一直在尝试使用表达式来加速这个过程,enumerate但我就是无法得到我想要的输出。在逐行方式每个文件最多需要 10 秒的情况下,枚举方式在大约 3 秒内给了我“一个”文件。我说“a”文件是因为我无法让输出与输入相匹配(添加了列)。

最后,我们使用的系统/软件基于 Python 2.X(实际上是 Jython)。

我知道这是让这个工作的地方,如果您有任何问题,请尽管提问!

4

1 回答 1

0

在这种情况下,通过不使用 csv 模块,您将获得性能提升,因为它拆分了很多不必要的内容。相反,请考虑使用更简单的split方法,将可选参数指定为仅通过分号分隔列来拆分一次。

with open(csvfile) as f, open(outputfile, 'w') as out:
    for line in f:
        tmp = line.split(';', 1) # splits only once
        tmp.insert(1, extra_string)
        out.write(';'.join(tmp))

我还没有检查 jython 是否支持双上下文管理器(它肯定支持单类型),如果不支持,请将其拆分为几行。

同时,这将防止内存过满(newdat.append如果文件远大于 3.5MB,则处理方式存在潜在风险)并将使用f.write. 当然,您不必被迫使用它:如果您发现填充内存然后调用它对您来说效果更好,writelines然后使用它(尽管缓冲机制总是由调用指定open,所以我不会期望看到 IO 差异)。

请注意,CPU 使用率仍可能飙升。所有这一切真正做到的是摆脱一些多余的 CPU 周期,所以它会更快地完成工作。就这样。

于 2015-04-15T00:56:05.507 回答