Python 从文本文件中读取随机块

Python 从文本文件中读取随机块,python,out-of-memory,deep-learning,Python,Out Of Memory,Deep Learning,对于深度学习模型,我需要分批加载数据。对于每一个历元(对所有数据进行完全迭代),每一行都需要传递一次,但重要的是数据以随机顺序馈送给算法。我的数据集太大,无法在内存中完全读取。它是长度可变的序列数据,输入格式可以更改,因为它是我的其他脚本输出的集群的转储。目前它是每行的一些元信息,然后序列被“;”分割 我目前的解决方案是一个生成器,它将所有行号混洗,将它们分为4个部分,然后读取文件,解析与块行号匹配的行。它生成批量大小的序列,直到没有剩余的序列,然后解析下一个行号块。这是可行的,但我觉得可能有更

对于深度学习模型,我需要分批加载数据。对于每一个历元(对所有数据进行完全迭代),每一行都需要传递一次,但重要的是数据以随机顺序馈送给算法。我的数据集太大,无法在内存中完全读取。它是长度可变的序列数据,输入格式可以更改,因为它是我的其他脚本输出的集群的转储。目前它是每行的一些元信息,然后序列被“;”分割


我目前的解决方案是一个生成器,它将所有行号混洗,将它们分为4个部分,然后读取文件,解析与块行号匹配的行。它生成批量大小的序列,直到没有剩余的序列,然后解析下一个行号块。这是可行的,但我觉得可能有更好的解决办法。谁有更好的工作流程?这是我经常遇到的问题。问题是,我正在完全扫描文件中的每个块,每个历元。尽管我可以让它只处理4个块,30个纪元,相当于读取一个大文件的120倍。

为内存中的行建立一个索引(这需要一次遍历文件,但不是全部在内存中),然后您可以随机快速地访问行

这并不可靠(无验证/范围检查等),但:


为内存中的行建立索引(这需要一次遍历文件,但不需要全部在内存中),然后您可以随机快速地访问行

这并不可靠(无验证/范围检查等),但:


“数据以随机顺序输入算法非常重要”顺序磁盘I/O API不是为这种疯狂行为设计的签名,一个对“深度学习”一无所知的人,我会用
set(file\u obj)
制作一套文件。然后使用
random.sample
获得正确数量的随机元素。@zondo这不是将整个文件内容加载到内存中吗?您要查找的随机性有多大?因为您可以复制数据,随机读取文件,或者如果有多个文件,则随机选择一个文件,然后随机选择起始位置和长度,然后跟踪使用bitmapI读取的内容。我假设您在文本文件中每行存储一行。使用固定大小的行是值得的,这样您就可以在不必扫描整个文件的情况下快速查找给定的行。“数据以随机顺序馈送到算法非常重要”顺序磁盘I/O API不是为这种疯狂行为而设计的。-签名,一个对“深度学习”一无所知的人,我会用
set(file\u obj)
制作一套文件。然后使用
random.sample
获得正确数量的随机元素。@zondo这不是将整个文件内容加载到内存中吗?您要查找的随机性有多大?因为您可以复制数据,随机读取文件,或者如果有多个文件,则随机选择一个文件,然后随机选择起始位置和长度,然后跟踪使用bitmapI读取的内容。我假设您在文本文件中每行存储一行。使用固定大小的行是值得的,这样您就可以快速查找给定的行,而不必扫描整个文件。
import sys

BUFFER_LEN = 1024


def findNewLines(s):
   retval = []
   lastPos = 0
   while True:
      pos = s.find("\n", lastPos)
      if pos >= 0:
         pos += 1
         retval.append(pos)
         lastPos = pos
      else:
         break
   return retval


class RandomAccessFile(object):
   def __init__(self, fileName):
      self.fileName = fileName
      self.startPositions = [0]
      with open(fileName, "rb") as f:
         looking = True
         fileOffset = 0
         while (looking):
            bytes = f.read(BUFFER_LEN)
            if len(bytes) < BUFFER_LEN:
               looking = False
            newLines = findNewLines(bytes)
            for newLine in newLines:
               self.startPositions.append(fileOffset+newLine)
            fileOffset += len(bytes)

   def GetLine(self, index):
      start, stop = self.startPositions[index],self.startPositions[index+1]-1
      with open(self.fileName, "rb") as f:
         f.seek(start)
         return f.read((stop-start)-1)



raf = RandomAccessFile('/usr/share/dict/words')


print raf.GetLine(0)
print raf.GetLine(10)
print raf.GetLine(456)
print raf.GetLine(71015)
python indexedFile.py
A
Aaronic 
abrim 
flippantness