我有很多来自分子动力学代码(Lammps)的输出文件,我有一个脚本可以解析文件并从输出文件中计算出一堆参数。每个文件介于4-17MB之间,脚本在大约3分钟内解析这些文件中的768个。文件的格式是文本而不是二进制文件。
问题在于:
脚本在处理4到5个这些文件夹(4~5 * 768)抱怨重塑错误问题后停止。但真正的原因是文本中插入了一堆“特殊字符”而没有任何充分的理由。我确信在解析脚本之前该文件没有被破坏,并且这些字符插入文本内部的唯一原因是实际运行脚本。
脚本是用python编写的,我在下面的命令中使用'r'键来确保脚本没有对文件的写访问权。
fid = open(file_path, 'r')
我在Matlab中重写了相同的脚本,同样存在问题也让我相信这是一个与我的硬件有关的I / O问题,而不是编码问题。
我在带有ext4格式硬盘和64 GB内存的ubuntu工作站上运行此脚本。 有趣的是,当我在群集上运行相同的脚本时,我无法复制此问题。即使是这个脚本的并行版本在群集上运行也没有问题,但在我的本地机器上却没有。
这是脚本的一部分,它使用打开的文件进行所有读取,文件的其余部分进行计算。最后,我将结果写在一个单独的文件中,这是一个非常小的文件(50 KB)。
for file_name in list_files:
if 'dump' in file_name:
print file_name
gb_name = dir_list[j]
gb_num = int(file_name[file_name.find('.')+1:len(file_name)])
i += 1
file_path = read_path + '/' + file_name
fid = open(file_path, 'r', 1)
junk = fid.readline(); junk = fid.readline(); junk = fid.readline();
num_lines = int(fid.readline())
junk = fid.readline()
if len(junk) > 26:
x_lims = map(float, fid.readline().split())
y_lims = map(float, fid.readline().split())
z_lims = map(float, fid.readline().split())
a_tri = abs(x_lims[1] - (x_lims[0]-y_lims[2]))
c_tri = abs(z_lims[1] - z_lims[0])
gb_area = a_tri * c_tri
junk = fid.readline()
else:
x_lims = map(float, fid.readline().split())
y_lims = map(float, fid.readline().split())
z_lims = map(float, fid.readline().split())
gb_area = abs(x_lims[1] - x_lims[0]) * abs(z_lims[1] - z_lims[0])
junk = fid.readline()
tmp = fid.readlines()
fid.close()
if len(tmp) == num_lines:
coords = np.array(map(float, ''.join(tmp).split())).reshape(num_lines, 7)
coords[::, 0:2].astype(int)
else:
raise Exception('Number of lines is not consistent with number of data points.')
以下是损坏文件的示例。请注意特殊字符:
99463 2 51.5597 211.814 41.7614k4.26088e-13 -3.35999
99881 2 52.1696 212.526 39.0575 4.91923e-/ef3 -3.35998
如果您有类似的经历,请在此留言。