Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中,在不将文件加载到RAM的情况下提取文件中的随机行_Python_File_Svmlight - Fatal编程技术网

在python中,在不将文件加载到RAM的情况下提取文件中的随机行

在python中,在不将文件加载到RAM的情况下提取文件中的随机行,python,file,svmlight,Python,File,Svmlight,我有很大的svmlight文件,用于机器学习。我想看看对这些文件进行采样是否能得到足够好的结果 我想提取文件的随机行,将它们输入到我的模型中,但我想在RAM中加载不太可能的信息 我在这里看到()我可以使用linecache,但所有的解决方案最终都会加载内存中的所有内容 有人能给我一些提示吗?多谢各位 编辑:忘了说我事先知道文件中的行数 您可以扫描文件一次,计算行数。一旦知道了这一点,就可以生成随机行号,重新读取文件并在看到该行时发出该行 实际上,由于您对多行感兴趣,您应该查看。您可以扫描文件一次

我有很大的svmlight文件,用于机器学习。我想看看对这些文件进行采样是否能得到足够好的结果

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

我在这里看到()我可以使用linecache,但所有的解决方案最终都会加载内存中的所有内容

有人能给我一些提示吗?多谢各位


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

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


实际上,由于您对多行感兴趣,您应该查看。

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


实际上,由于您对多行感兴趣,您应该查看。

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

import heapq
import random

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

这是非常有效的,因为heapq保持固定的大小,它不需要对数据进行预扫描,而是在选择其他元素时交换出元素-因此,最多一次在内存中存储
大小
元素。

您可以使用
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]

只要行不是很大,这就不会太麻烦。

一个选项是对文件进行随机搜索,然后在读取行之前向后查找换行符(或文件的开头)。下面是一个程序,它将随机打印当前目录中找到的每个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]

只要线不是很大,这就不会太麻烦。

如果是大文件,重新读取文件不是非常低效吗?(我说的是>10Gb的文件)是的,在这种情况下,你应该使用储层采样技术。如果是大文件,可能不会重新读取文件是非常低效的?(我说的是>10Gb的文件)是的,在这种情况下,你应该使用水库采样技术。我可能忘了说我知道我文件中的行数,难道我不能利用这一点吗?@AdrienNK唯一的优势是如果你的行是固定长度的,这样你可以在生成0到I行之间的n个整数后直接查找每条记录n文件…否则,它没有任何优势…好的,谢谢你的回答。我仍然不确定什么是记录,但我会调查一下!我以为这样做的目的是避免读取整个文件。如果文件足够大,以至于将它们加载到内存中是一个问题,I/O时间不会占主导地位吗?@holdenweb我不知道现在…我正在处理,但我想在RAM中加载不太可能的信息。这就做到了(据我们所知,它们正在使用SSD,所以I/o时间不一定是这样的负担)…我已经提到,如果线是固定长度的,则查找是可行的,我刚刚注意到您介绍了一个查找和查找线的示例,该示例针对线不是固定长度的地方。我认为如果性能成为问题,则应由OP根据其具体情况尝试其他解决方案。我忘了说我知道我的文件中有f行,难道我不能利用它吗?@AdrienNK唯一的优势是如果你的行是固定长度的,这样你可以在文件中生成0到行之间的n个整数后直接查找每个记录……否则,它没有任何优势……好的,谢谢你的回答。我仍然不确定到底是什么被认为是记录,但我会调查一下!我以为目的是避免读取整个文件。如果文件足够大,加载到内存是一个问题,I/O时间是否会占主导地位?@holdenweb我不知道…我正在处理,但我想在RAM中加载不太可能的信息。这样做了(据我们所知,它们正在使用SSD,因此i/o时间不一定是这样的负担)…我已经提到,如果线是固定长度的,则查找是可行的,我刚刚注意到您介绍了一个查找和查找线的示例。我认为,如果性能成为问题,则由OP根据其具体情况尝试其他解决方案。此解决方案很好(无论如何,在我看来)在ASCII世界中,但多字节可变长度编码的变化无常意味着当使用Unicode时,它不能被认为是可靠的。这种代码也不能移植到Python 3中。这种解决方案很好(无论如何,在我看来)在ASCII世界中,但多字节可变长度编码的变化无常意味着在使用Unicode时,它不能被认为是可靠的。正如前面介绍的,该代码也不能移植到Python 3。