我正在处理一组包含GPS数据的大约1000个大型(700MB+) CSV。时间戳当前在UTC时区,我想将其更改为PST。
我编写了一个Python脚本来解析文件,用正确的值更新两个时间戳字段,然后将它们写入文件。最初,我希望最小化磁盘写操作的数量,所以在每一行上,我将更新后的行附加到一个字符串中。最后,我对文件进行了一次大的写操作。对于小文件,这与预期的一样有效,但对于大文件,它会挂起。
然后,我更改了脚本,以便在处理每一行时写入文件。这是有效的,并且不会挂起。
为什么第一种解决方案不适用于大文件,还有比一次一行地编写文件更好的方法吗?
构建一个大字符串:
def correct(d, s):
# given a directory and a filename, corrects for timezone
file = open(os.path.dirname(os.path.realpath(sys.argv[0])) + separator() + d + separator() + s)
contents = file.read().splitlines()
header = contents[0]
corrected_contents = header + '\n'
for line in contents[1:]:
values = line.split(',')
sample_date = correct_time(values[1])
system_date = correct_time(values[-1])
values[1] = sample_date
values[-1] = system_date
corrected_line = ','.join(map(str, values)) + '\n'
corrected_contents += corrected_line
corrected_file = os.path.dirname(os.path.realpath(sys.argv[0])) + separator() + d + separator() + "corrected_" + s
with open (corrected_file, 'w') as text_file:
text_file.write(corrected_contents)
return corrected_file
写下每一行:
def correct(d, s):
# given a directory and a filename, corrects for timezone
file = open(os.path.dirname(os.path.realpath(sys.argv[0])) + separator() + d + separator() + s)
contents = file.read().splitlines()
header = contents[0]
corrected_file = os.path.dirname(os.path.realpath(sys.argv[0])) + separator() + d + separator() + "corrected_" + s
with open (corrected_file, 'w') as text_file:
text_file.write(header + '\n')
for line in contents[1:]:
values = line.split(',')
sample_date = correct_time(values[1])
system_date = correct_time(values[-1])
values[1] = sample_date
values[-1] = system_date
corrected_line = ','.join(map(str, values)) + '\n'
text_file.write(corrected_line)
return corrected_file
发布于 2018-06-09 05:41:05
我相信这句话:
corrected_contents += corrected_line
才是罪魁祸首。IIUC (如果我错了,我相信人们会纠正我),它分配一个更大的字符串,复制旧的内容,然后附加新的内容-对于文件中的每一行。随着它变得越来越长,需要复制的内容越来越多,你最终得到了你正在观察的行为。
在How do I append one string to another in Python?上有更多关于字符串连接的信息,其中提到了显然CPython在某些情况下对此进行了优化,并将其从二次转换为线性(所以我上面可能是错的:您的情况可能是优化的情况)。它还提到了pypy
没有。所以这也取决于你如何运行你的程序。也有可能是因为字符串太大(毕竟足以填满一张CD ),所以无法进行优化。
链接的答案还包含大量关于解决问题的方法的信息(如果确实是问题所在)。很值得一读。
https://stackoverflow.com/questions/50768503
复制相似问题