私は2つのcsvファイルを持っています(そのうち1つは.tabです)。どちらも2列の数字列です。私の仕事は、最初のファイルの各行を調べ、それが2番目のファイルのいずれかの行と一致するかどうかを確認することです。もしそうなら、私は出力csvファイルに空白行を表示します。それ以外の場合は、出力のcsvファイルに 'R、R'を出力します。私の現在のアルゴリズムは以下のない:第二のファイル(二つの整数それぞれ)の各行は、2次元アレイでこれらの二つの整数の位置に移動非常に大きなcsvファイルを検索するにはどうすればよいですか?
- スキャン(SO整数2と3であれば、私は
- 最初のファイルの各行を調べ、各行の2つの整数の位置が配列内の値1であるかどうかを確認し、その出力を3番目のcsvファイルに出力します。
残念ながら、csvファイルは非常に大きいので、これを実行すると即座に "MemoryError:"が表示されます。大規模なCSVファイルをスキャンするための代替手段は何ですか?
私はジュピターノートを使用しています。私のコード:
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'ギグが必要です。しかし、あなたのファイルを見ると、それらは**ちょっと**です。おそらくそれらを両方ともメモリにロードし、1つのセットを作り、次にもう一方を繰り返し、メンバーシップのセットをチェックしてください。あなたが得ることができる可能性のあるサイズの大きさである配列を使うことは、これを達成するためにおそらく最小限のメモリ効率的な方法でしょう。 –