首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >写入大型CSVs内存使用量与随机磁盘访问

写入大型CSVs内存使用量与随机磁盘访问
EN

Stack Overflow用户
提问于 2018-06-09 05:17:24
回答 1查看 32关注 0票数 0

我正在处理一组包含GPS数据的大约1000个大型(700MB+) CSV。时间戳当前在UTC时区,我想将其更改为PST。

我编写了一个Python脚本来解析文件,用正确的值更新两个时间戳字段,然后将它们写入文件。最初,我希望最小化磁盘写操作的数量,所以在每一行上,我将更新后的行附加到一个字符串中。最后,我对文件进行了一次大的写操作。对于小文件,这与预期的一样有效,但对于大文件,它会挂起。

然后,我更改了脚本,以便在处理每一行时写入文件。这是有效的,并且不会挂起。

为什么第一种解决方案不适用于大文件,还有比一次一行地编写文件更好的方法吗?

构建一个大字符串:

代码语言:javascript
复制
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

写下每一行:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-09 05:41:05

我相信这句话:

代码语言:javascript
复制
   corrected_contents += corrected_line

才是罪魁祸首。IIUC (如果我错了,我相信人们会纠正我),它分配一个更大的字符串,复制旧的内容,然后附加新的内容-对于文件中的每一行。随着它变得越来越长,需要复制的内容越来越多,你最终得到了你正在观察的行为。

How do I append one string to another in Python?上有更多关于字符串连接的信息,其中提到了显然CPython在某些情况下对此进行了优化,并将其从二次转换为线性(所以我上面可能是错的:您的情况可能是优化的情况)。它还提到了pypy没有。所以这也取决于你如何运行你的程序。也有可能是因为字符串太大(毕竟足以填满一张CD ),所以无法进行优化。

链接的答案还包含大量关于解决问题的方法的信息(如果确实是问题所在)。很值得一读。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50768503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档