【发布时间】:2016-12-22 22:42:00
【问题描述】:
我有 2 个 csv 文件(其中一个是 .tab),它们都有 2 列数字。我的工作是遍历第一个文件的每一行,看看它是否与第二个文件中的任何行匹配。如果是这样,我会在我的输出 csv 文件中打印一个空行。否则,我将 'R,R' 打印到输出 csv 文件。我当前的算法执行以下操作:
- 扫描第二个文件的每一行(每行两个整数),转到二维数组中这两个整数的位置(所以如果整数是 2 和 3,我将转到位置 [2,3])并赋值为 1。
- 遍历第一个文件的每一行,检查每一行的两个整数在数组中的位置是否为1,然后将相应的输出打印到第三个csv文件。
不幸的是 csv 文件非常大,所以我在运行时立即收到“MemoryError:”。扫描大型 csv 文件的替代方法是什么?
我正在使用 Jupyter Notebook。我的代码:
import csv
import numpy
def SNP():
thelines = numpy.ndarray((6639,524525))
tempint = 0
tempint2 = 0
with open("SL05_AO_RO.tab") as tsv:
for line in csv.reader(tsv, dialect="excel-tab"):
tempint = int(line[0])
tempint2 = int(line[1])
thelines[tempint,tempint2] = 1
return thelines
def common_sites():
tempint = 0
tempint2 = 0
temparray = SNP()
print('Checkpoint.')
with open('output_SL05.csv', 'w', newline='') as fp:
with open("covbreadth_common_sites.csv") as tsv:
for line in csv.reader(tsv, dialect="excel-tab"):
tempint = int(line[0])
tempint2 = int(line[1])
if temparray[tempint,tempint2] == 1:
a = csv.writer(fp, delimiter=',')
data = [['','']]
a.writerows(data)
else:
a = csv.writer(fp, delimiter=',')
data = [['R','R']]
a.writerows(data)
print('Done.')
return
common_sites()
文件: https://drive.google.com/file/d/0B5v-nJeoVouHUjlJelZtV01KWFU/view?usp=sharing 和 https://drive.google.com/file/d/0B5v-nJeoVouHSDI4a2hQWEh3S3c/view?usp=sharing
【问题讨论】:
-
问题可能是这样的:
numpy.ndarray((6639,524525))。你不应该使用ndarray构造函数,你应该使用array或zeros。但无论如何,您正在制作一个 6639*524525 的np.float64数组,这将至少需要6639*524525*1e-9*(64/8)==27.8585718演出。但是查看您的文件,它们很小,您可能只需将它们都加载到内存中,从一个中创建一个集合,然后遍历另一个并检查该集合的成员资格。使用与您可以获得的可能数字大小相同的数组可能是实现这一目标的内存效率最低的方法。