当前位置: 首页 > 知识库问答 >
问题:

Python,内存错误,csv文件太大[重复]

商琛
2023-03-14

我遇到了一个python模块的问题,它无法处理导入大数据文件(文件targets.csv的权重接近1 Gb)

加载此行时会追加错误:

targets = [(name, float(X), float(Y), float(Z), float(BG))
           for name, X, Y, Z, BG in csv.reader(open('targets.csv'))]

回溯:

Traceback (most recent call last):
  File "C:\Users\gary\Documents\EPSON STUDIES\colors_text_D65.py", line 41, in <module>
    for name, X, Y, Z, BG in csv.reader(open('targets.csv'))]
MemoryError

我想知道有没有一种方法可以逐行打开targets.csv文件?同时也想知道这会减慢这个过程吗?

这个模块已经很慢了...

谢谢!

import geometry
import csv
import numpy as np
import random
import cv2

S = 0


img = cv2.imread("MAP.tif", -1)
height, width = img.shape

pixx = height * width
iterr = float(pixx / 1000)
accomplished = 0
temp = 0

ppm = file("epson gamut.ppm", 'w')

ppm.write("P3" + "\n" + str(width) + " " + str(height) + "\n" + "255" + "\n")
# PPM file header

all_colors = [(name, float(X), float(Y), float(Z))
              for name, X, Y, Z in csv.reader(open('XYZcolorlist_D65.csv'))]

# background is marked SUPPORT
support_i = [i for i, color in enumerate(all_colors) if color[0] == '255 255 255']
if len(support_i)>0:
    support = np.array(all_colors[support_i[0]][1:])
    del all_colors[support_i[0]]
else:
    support = None

tg, hull_i = geometry.tetgen_of_hull([(X,Y,Z) for name, X, Y, Z in all_colors])
colors = [all_colors[i] for i in hull_i]

print ("thrown out: "
       + ", ".join(set(zip(*all_colors)[0]).difference(zip(*colors)[0])))

targets = [(name, float(X), float(Y), float(Z), float(BG))
           for name, X, Y, Z, BG in csv.reader(open('targets.csv'))]

for target in targets:


    name, X, Y, Z, BG = target

    target_point = support + (np.array([X,Y,Z]) - support)/(1-BG)

    tet_i, bcoords = geometry.containing_tet(tg, target_point)

    if tet_i == None:
        #print str("out")    
        ppm.write(str("255 255 255") + "\n")
        print "out"

        temp += 1

        if temp >= iterr:

            accomplished += temp 
            print str(100 * accomplished / (float(pixx))) + str(" %")
            temp = 0

        continue 
        # not in gamut

    else:

        A = bcoords[0]
        B = bcoords[1]
        C = bcoords[2]
        D = bcoords[3]

        R = random.uniform(0,1)

        names = [colors[i][0] for i in tg.tets[tet_i]]

        if R <= A:
            S = names[0] 

        elif R <= A+B:
            S = names[1]

        elif R <= A+B+C:
            S = names[2]

        else:
            S = names[3]

        ppm.write(str(S) + "\n")

        temp += 1

        if temp >= iterr:

            accomplished += temp 
            print str(100 * accomplished / (float(pixx))) + str(" %")
            temp = 0


print "done"
ppm.close()

共有1个答案

缪朝
2023-03-14

csv.reader()已经一次读取一行。但是,您首先要将所有行收集到一个列表中。您应该一次处理一行。一种做法是改用发电机,例如:

targets = ((name, float(X), float(Y), float(Z), float(BG))
           for name, X, Y, Z, BG in csv.reader(open('targets.csv')))

(从方括号切换到括号应将target从列表理解更改为生成器。)

 类似资料:
  • 当我试图在Python中打印CSV文件的内容时,我得到了这个错误。 回溯(最近调用最后):文件“/users/cassandracampbell/library/preferences/pycharmce2018.2/scratches/player.py”,第5行,在打开('player.csv')的csvfile:filenotfounderror:[errno2]中没有这样的文件或目录:'p

  • 问题内容: 当我使用以下代码读取文件时: 我有以下错误 文件大小是 问题答案: 显然,文件太大,无法一次全部读入内存。 为什么不使用: 或者,如果您未使用Python 2.6和更高版本,则: 在这两种情况下,您都将获得一个迭代器,该迭代器可以像对待字符串列表一样对待。 编辑:由于您将整个文件读取为一个大字符串然后在换行符上进行拆分的方式将删除过程中的换行符,因此我在示例中添加了a ,以便更好地模拟

  • 我有一个gsp文件,其中包含1800行代码和从该视图渲染的两个模板。在我添加几个if条件之前,该视图工作得非常好。 堆栈跟踪如下:

  • 我正在学习如何通过pandas将大型csv文件加载到python中。我正在使用anaconda和Python3与一台64 GB内存的pc。 贷款组合是一个很大的例子。csv数据集由2509列和100000行组成,约为1.4 GBs。 我可以毫无错误地运行以下代码: 然而,当我使用贷款组合时,例如,大型。csv文件创建一个更大的文件,即Loan\u Portfolio\u Example\u Lar

  • 我正在处理一个csv文件,在此之前,我使用下面的代码获取行数。 代码是在这个链接中给出的帮助下编写的。但是,total_rows与csv文件中的实际行数不匹配。我已经找到了一个替代方案,但想知道为什么这是不正确的工作?? 在CSV文件中,有大量文本的单元格,我必须使用编码来避免读取CSV文件时出错。 感谢您的帮助!

  • 问题内容: 我正在尝试使用将大文件(> 1 GB)从硬盘复制到USB驱动器。一个描述我正在尝试做的简单脚本是: 在Linux上只需要2-3分钟。但是在Windows下,同一文件上的同一文件副本要花费10-15分钟以上的时间。有人可以解释为什么并给出一些解决方案,最好使用python代码吗? 更新1 将文件另存为test.pySource文件大小为1 GB。目的地目录位于USB驱动器中。使用ptim