Python 有没有更有效的方法将大文件中的行追加到numpy数组中记忆者

Python 有没有更有效的方法将大文件中的行追加到numpy数组中记忆者,python,csv,numpy,out-of-memory,text-mining,Python,Csv,Numpy,Out Of Memory,Text Mining,我正试图使用这个包来处理一个术语文档矩阵csv文件,其中39568行27519列只包含计数/自然数 问题:我读取文件并将其存储到numpy数组的方法导致内存错误 目标:从TDM csv文件中获取数字,并将其转换为numpy数组,以便我可以使用numpy数组作为lda的输入 with open("Results/TDM - Matrix Only.csv", 'r') as matrix_file: matrix = np.array([[int(value) for value in l

我正试图使用这个包来处理一个术语文档矩阵csv文件,其中39568行27519列只包含计数/自然数

问题:我读取文件并将其存储到numpy数组的方法导致内存错误

目标:从TDM csv文件中获取数字,并将其转换为numpy数组,以便我可以使用numpy数组作为lda的输入

with open("Results/TDM - Matrix Only.csv", 'r') as matrix_file:
    matrix = np.array([[int(value) for value in line.strip().split(',')] for line in matrix_file])
我也尝试过使用numpyappend、vstack和concatenate,但仍然得到了MemoryError

有没有办法避免记忆错误

编辑:

我尝试过使用数据类型int32和int,它提供了:

WindowsError:[错误8]没有足够的存储空间来处理此命令

我还尝试使用dtype float64,它提供了:

溢出错误:无法将“long”放入索引大小的整数中

使用这些代码:

fp = np.memmap("Results/TDM-memmap.txt", dtype='float64', mode='w+', shape=(len(documents), len(vocabulary)))
matrix = np.genfromtxt("Results/TDM.csv", dtype='float64', delimiter=',', skip_header=1)
fp[:] = matrix[:]

其他可能重要的信息

  • Win10 64位
  • 8GB RAM(7.9可用)|在报告内存错误之前,峰值为5.5GB,而不是3GB左右(使用2GB左右)
  • Python 2.7.10[MSC v.1500 32位(英特尔)]
  • 使用PyCharm社区版5.0.3

由于您的字数几乎都是零,因此将它们存储在
scipy.sparse
矩阵中会更有效率。例如:

from scipy import sparse
import textmining
import lda

# a small example matrix
tdm = textmining.TermDocumentMatrix()
tdm.add_doc("here's a bunch of words in a sentence")
tdm.add_doc("here's some more words")
tdm.add_doc("and another sentence")
tdm.add_doc("have some more words")

# tdm.sparse is a list of dicts, where each dict contains {word:count} for a single
# document
ndocs = len(tdm.sparse)
nwords = len(tdm.doc_count)
words = tdm.doc_count.keys()

# initialize output sparse matrix
X = sparse.lil_matrix((ndocs, nwords),dtype=int)

# iterate over documents, fill in rows of X
for ii, doc in enumerate(tdm.sparse):
    for word, count in doc.iteritems():
        jj = words.index(word)
        X[ii, jj] = count
X
现在是一个(ndocs,nwords),
words
是一个对应于
X
列的列表:

print(words)
# ['a', 'and', 'another', 'sentence', 'have', 'of', 'some', 'here', 's', 'words', 'in', 'more', 'bunch']

print(X.todense())
# [[2 0 0 1 0 1 0 1 1 1 1 0 1]
#  [0 0 0 0 0 0 1 1 1 1 0 1 0]
#  [0 1 1 1 0 0 0 0 0 0 0 0 0]
#  [0 0 0 0 1 0 1 0 0 1 0 1 0]]
您可以将
X
直接传递给,但将其转换为第一个可能会更快:

X=X.tocsr()
模型=lda.lda(n_主题=2,随机状态=0,n_iter=100)
模型拟合(X)
#信息:lda:n\U文档:4
#信息:lda:vocab_尺寸:13
#信息:lda:n\u单词:21
#信息:lda:n\U主题:2
#资料:lda:n_iter:100
#信息:lda:对数可能性:-126
#信息:lda:对数可能性:-102
#信息:lda:对数可能性:-99
#信息:lda:对数可能性:-97
#信息:lda:对数可能性:-100
#信息:lda:对数可能性:-100
#信息:lda:对数可能性:-104
#信息:lda:对数可能性:-108
#信息:lda:对数可能性:-98
#信息:lda:对数可能性:-98
#信息:lda:对数可能性:-99

您试过了吗?将列表理解(生成列表的嵌套列表)与
数组
调用分开。哪一个产生内存错误
loadtxt
genfromtxt
基本上就是做你正在做的事情——收集列表中的值并在最后生成数组。根据数据集中有多少个零,使用稀疏矩阵格式来避免内存错误可能会很有用。@karlson是的,刚才我从
中得到错误…\numpy\lib\npyio.py,第916行,在loadtxt中,表示i的
,枚举(itertools.chain([first_line],fh)]中的行:
后跟
内存错误
最终数组将包含什么数据类型?如果无法在内存中保存整个.csv文件,则可以读取连续的行块(),然后将它们写入(可能)numpy数组或HDF5文件。我花了一段时间安装了SciPy并在PyCharm上使用它。最终使用了来自的Scipy。用我的数据尝试了上面的代码,它工作得更快!感谢您提供有关将
tdm
转换为
scipy稀疏矩阵的快速指南,并感谢您的时间!
print(words)
# ['a', 'and', 'another', 'sentence', 'have', 'of', 'some', 'here', 's', 'words', 'in', 'more', 'bunch']

print(X.todense())
# [[2 0 0 1 0 1 0 1 1 1 1 0 1]
#  [0 0 0 0 0 0 1 1 1 1 0 1 0]
#  [0 1 1 1 0 0 0 0 0 0 0 0 0]
#  [0 0 0 0 1 0 1 0 0 1 0 1 0]]
X = X.tocsr()
model = lda.LDA(n_topics=2, random_state=0, n_iter=100)
model.fit(X)
# INFO:lda:n_documents: 4
# INFO:lda:vocab_size: 13
# INFO:lda:n_words: 21
# INFO:lda:n_topics: 2
# INFO:lda:n_iter: 100
# INFO:lda:<0> log likelihood: -126
# INFO:lda:<10> log likelihood: -102
# INFO:lda:<20> log likelihood: -99
# INFO:lda:<30> log likelihood: -97
# INFO:lda:<40> log likelihood: -100
# INFO:lda:<50> log likelihood: -100
# INFO:lda:<60> log likelihood: -104
# INFO:lda:<70> log likelihood: -108
# INFO:lda:<80> log likelihood: -98
# INFO:lda:<90> log likelihood: -98
# INFO:lda:<99> log likelihood: -99