Ошибка памяти при чтении большого файла - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь прочитать файл размером 59 ГБ и разбить его на несколько новых файлов в соответствии с некоторым идентификатором, найденным в начале каждой строки. Я запускаю код ниже, который ломается с ошибкой памяти после создания 45 ГБ файлов. Системная память остается на очень низком уровне в течение всего времени и внезапно создает после того, как код работает в течение примерно 2 часов. У меня есть 16 ГБ оперативной памяти. Я неправильно использую буферизацию? Любая идея?

outputFile = '/home/.../folder1'
directory = '/home/.../folder2/'

with open(directory + 'aldk_tab_1mn.csv', 'r', buffering=50000000) as fin: 
    firstLine = fin.readline()
    print(firstLine)

    for line in fin:
        testChar = line[0:4]
        if testChar[0] == 'A' :
            if not os.path.exists(outputFile + '/A/' + testChar+'.csv'):   # first time open a file             
                with open(outputFile + '/A/' + testChar+'.csv', 'a') as foutA:
                    print('file', testChar, 'created')                    
                    foutA.write(firstLine)
                    foutA.write(line)          
            else: 
                with open(outputFile + '/A/' + testChar+'.csv', 'a') as foutA:
                    foutA.write(line)          
        else:
            if not os.path.exists(outputFile + '/B/' + testChar+'.csv'):   # first time open a file             
                with open(outputFile + '/B/' + testChar+'.csv', 'a') as foutB:
                    print('file', testChar, 'created')
                    foutB.write(firstLine)
                    foutB.write(line) 
            else: 
                with open(outputFile + '/B/' + testChar+'.csv', 'a') as foutB:
                    foutB.write(line)   

Произошла ошибка

MemoryError                               
Traceback (most recent call last)
 <ipython-input-17-761f2fcce982> in <module>()
  6 
----> 7     for line in fin:
  8         testChar = line[0:4]
  9         if testChar[0] == 'A' :

MemoryError: 

1 Ответ

0 голосов
/ 04 мая 2018

Спасибо за ответы, похоже, что файл имел пустые символы после определенной точки, что приводило к взрыву строковой переменной, как предложил @Martijn!

Итак, я нарезал свой файл! Спасибо, ребята!

...