2016-08-12 3 views
0

깊은 학습 모델의 경우 데이터를 일괄 적으로로드해야합니다. 모든 에포크 (모든 데이터에 대한 전체 반복)마다 모든 행을 한 번 전달해야하지만 데이터가 임의의 순서로 알고리즘에 전달되는 것이 중요합니다. 내 데이터 세트가 너무 커서 메모리에서 완전히 읽을 수 없습니다. 길이가 가변적 인 시퀀스 데이터 일 때 입력 형식은 다른 스크립트가 출력하는 클러스터의 덤프이기 때문에 변경할 수 있습니다. 현재 그것은 행당 몇 가지 메타 정보이고 시퀀스는 ';'로 나뉩니다.텍스트 파일에서 임의의 청크 읽기

내 현재 솔루션은 모든 줄 번호를 임의로 섞어서 4 개씩 덩어리로 만들고 파일을 읽어 청크 줄 번호와 일치하는 줄을 파싱하는 생성기입니다. 아무것도 남지 않을 때까지 일괄 처리 된 크기의 시퀀스를 생성 한 다음 다음 줄 번호의 덩어리를 구문 분석합니다. 그것은 작동하지만 더 나은 해결책이있는 것처럼 느껴집니다. 누가 더 나은 워크 플로우를 가지고 있습니까? 이것은 내가 정기적으로 실행하는 문제입니다. 문제는 매 청크마다 모든 파일을 완전히 스캔한다는 것입니다. 비록 내가 단지 4 개의 덩어리로 작업 할 수는 있지만, 30 개의 에포크는 120 개의 큰 파일을 읽는 것입니다.

+2

* "는 데이터를 랜덤으로 공급하는 것이 중요 알고리즘 주문 "* 시퀀셜 디스크 I/O API는 이러한 종류의 미친 짓을 위해 설계되지 않았습니다. - "깊은 학습"에 대해 아무것도 모르는 사람이 서명 했음 –

+0

'set (file_obj) '를 사용하여 파일 세트를 만들 것입니다. 그런 다음 random.sample을 사용하여 적절한 수의 무작위 요소를 가져옵니다. – zondo

+0

@ zondo는 전체 파일 내용을 메모리에로드하지 않습니까? –

답변

3

메모리에있는 행의 색인을 작성하십시오 (파일에는 단일 통과가 필요하지만 메모리에는 모두 포함되지는 않음). 그러면 선을 임의로 빠르게 액세스 할 수 있습니다.

이 강력하지 않다

(NO 검증/범위 검사 등) :하지만

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