我有用于机器学习目的的大型 svmlight 文件。我正在尝试查看这些文件的总采样是否会产生足够好的结果。
我想提取文件的随机行以将它们提供给我的模型,但我想在 RAM 中加载不太可能的信息。
我在这里看到(从 Python 中的文件中读取一些随机行)我可以使用 linecache,但所有解决方案最终都会将所有内容加载到内存中。
有人可以给我一些提示吗?谢谢你。
编辑:忘了说我事先知道文件中的行数。
我有用于机器学习目的的大型 svmlight 文件。我正在尝试查看这些文件的总采样是否会产生足够好的结果。
我想提取文件的随机行以将它们提供给我的模型,但我想在 RAM 中加载不太可能的信息。
我在这里看到(从 Python 中的文件中读取一些随机行)我可以使用 linecache,但所有解决方案最终都会将所有内容加载到内存中。
有人可以给我一些提示吗?谢谢你。
编辑:忘了说我事先知道文件中的行数。
您可以使用 a根据随机数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]
只要线路不是很大,这不应该是过度的负担。
您可以扫描文件一次,计算行数。一旦知道这一点,您就可以生成随机行号,重新读取文件并在看到该行时发出该行。
实际上,由于您对多行感兴趣,因此您应该查看Efficiently selection a set of random elements from a linked list。