【问题标题】:Comparing Large CSV file rows to other rows - Python - Memory Issues将大型 CSV 文件行与其他行进行比较 - Python - 内存问题
【发布时间】:2015-11-14 17:11:39
【问题描述】:

在谈到 Python 时,我比较天真,因此对任何不相关的陈述表示歉意。

我正在使用一个包含大约 500k 行的 CSV 文件。 (~60 MB)

我需要在读取文件时对文件进行一些基本的清理,这很好,但我还需要将 CSV 的每一行与同一文件的每一行进行比较。最初我已加载文件并将其存储在 List 中,然后循环两次以比较行。这可能是一种愚蠢的方法,因为我很快就耗尽了内存。它看起来像这样:

for row in self.trainingdata:
        for row2 in self.trainingdata:
            # Do Stuff

我的问题是,最节省内存的方法是什么?我应该两次打开同一个文件并比较每一行吗?还是有更好的方法来存储数据?我正在寻找一些关于最佳方法的高级指导。我目前的想法如下,但我还没有完成:

with open('/ThisIsTheFile', 'rU') as csvread:
        reader = csv.reader(csvread, delimiter=',')
        with open('/ThisIsTheFile', 'rU') as csvread2:
            reader2 = csv.reader(csvread2, delimiter=',')
            #Do Stuff

感谢您的帮助!

【问题讨论】:

  • 这不是一个很大的文件,你是从哪里运行的?
  • 看看filecmp。让它成为你方法的先驱。所以它会快速运行相同的而不是循环
  • 你在做什么样的比较?文件中的每一行都是 1 行吗?是文件中的另一行与另一特定行相对的行吗?你试过 deepcopy 模块吗?我可以帮助不必再次阅读文件
  • @GermanRosales,deepcopy 将如何提供帮助?读取文件不会导致内存问题,存储更多数据会
  • 我应该打开同一个文件两次deepcopy 将有助于获取列表的副本

标签: python csv for-loop memory


【解决方案1】:

正如@Padraic 指出的那样,这个文件不够大,不用担心内存不足。关于执行所需操作的最佳方法是使用此代码示例中的字典:

dictio = {}
file2 = open(file)
for line in file2.readlines():
    parts = line.split(' ')
    if parts[0] in dictio:
        print('duplicate ' + line)
    else:
        dictio[parts[0]] = parts[1]

其中 parts[0] 只是行中的随机部分以识别为唯一部分,您可以使用任何您想要的标准作为字典的键

【讨论】:

    【解决方案2】:

    你在使用一些 unix 吗? sort -u 怎么样,或者如果您只需要基于某个列值进行唯一化,sort -t',' -k1,1 -u?当您的文件增长时,添加类似 -S500MB 的内容以保持在 RAM 中的排序...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-18
      • 2023-04-11
      • 2017-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多