python sklearn读取了非常大的svmlight文件

时间:2017-07-17 10:20:25

标签: python scikit-learn sparse-matrix libsvm svmlight

我正在使用带有svmlight的python 2.7来存储和读取一个非常大的svmlight格式文件。

我正在使用

阅读文件
import sklearn
rows, labels = sklearn.datasets.load_svmlight_file(matrixPath, zero_based=True)

文件太大,无法存储在内存中。我正在寻找一种方法来批量迭代文件,而无需事先拆分文件。

现在我找到的最好的方法是使用terminal命令split拆分svmlight文件。然后读取我创建的部分文件。

I found读取大文件的好方法是逐行读取,以免溢出内存。

如何使用svmlight格式文件执行此操作?

谢谢!

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,这是我的解决方案:

使用scikitlearn的load_svmlight_file函数,可以指定offsetlength参数。来自documentation

偏移量:整数,可选,默认为0

  • 通过向前搜索来忽略偏移的第一个字节,然后丢弃随后的字节,直到下一个新的行字符为止。

长度:整数,可选,默认为-1

  • 如果严格肯定,则一旦文件中的位置达到(偏移+长度)字节阈值,就停止读取任何新的数据行。

下面是一个示例,该示例说明了如何批量访问svmlight文件:

from sklearn.datasets import load_svmlight_file

def load_svmlight_batched(filepath, n_features, batch_size):
    offset = 0
    with open(filepath, 'rb') as f:
        X, y = load_svmlight_file(f, n_features=n_features,
                                  offset=offset, length=batch_size)
        while X.shape[0]:
            yield X, y
            offset += batch_size
            X, y = load_svmlight_file(f, n_features=n_features,
                                      offset=offset, length=batch_size)

def main(filepath):
    iterator = load_svmlight_batched(filepath, 
                                     n_features=2**14, 
                                     batch_size=10000)
    for X_batch, y_batch in iterator:
        # Do something