繁体   English   中英

在文件中提取随机行而不将文件加载到python中的RAM中

[英]Extracting a random line in a file without loading the file into RAM in python

我有用于机器学习目的的大型svmlight文件。 我正在尝试查看这些文件的加采样是否会导致足够好的结果。

我想提取文件的随机行以将它们输入到模型中,但是我想在RAM中加载尽可能少的信息。

我在这里看到了(可以从Python文件中读取许多随机行 ),我可以使用行缓存,但是所有解决方案最终都将所有内容加载到内存中。

有人可以给我一些提示吗? 谢谢。

编辑:忘记说我事先知道文件中的行数。

您可以使用heapq根据随机数选择n条记录,例如:

import heapq
import random

SIZE = 10
with open('yourfile') as fin:
    sample = heapq.nlargest(SIZE, fin, key=lambda L: random.random())

这是非常有效的,因为heapq保持固定大小,不需要预扫描数据,并且在选择其他元素时就可以换出元素-因此最多您一次只能在内存中获得SIZE元素。

一种选择是对文件进行随机查找,然后在读取一行之前向后寻找换行符(或文件的开头)。 这是一个程序,它随机打印在当前目录中找到的每个Python程序行。

import random
import os
import glob

for name in glob.glob("*.py"):
    mode, ino, den, nlink, uid, gid, size, atime,  mtime, ctime = os.stat(name)
    inf = open(name, "r")
    location = random.randint(0, size)
    inf.seek(location)
    while location > 0:
        char = inf.read(1)
        if char == "\n":
            break
        location -= 1
        inf.seek(location)
    line = inf.readline()
    print name, ":", line[:-1]

只要行数不大,这就不会造成不必要的负担。

您可以扫描文件一次,计算行数。 知道这一点后,您可以生成随机行号,重新读取文件并在看到它时发出该行。

实际上,由于您对多行感兴趣,因此您应该查看从链接列表有效地选择一组随机元素

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM