用python读取一个大的文本文件会杀死我的程序

2024-04-24 23:04:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我编写了一个python脚本来读取文本文件,并将其信息放入字典中。原始文本文件为2.6GB,包含56981936行,其中我只需要将第一行链接到字典中的第二行和第四行。我最近从windows(如果这个程序运行正常的话)切换到Linux,在那里它不断被杀死。有人知道为什么吗

文本格式为fastQ文件,其中包含以下格式的重复行:

@xxxxxxxxxxx
CTTCTCAACTC
+
AAAEE#AEE#A

这是我的原始代码:

def createReverseDict(backwardsFile):
    reverseDict = {}
    with open(backwardsFile) as f3:
            while True:
                label       = f3.readline().rstrip()
                if not label:
                    break
                sequence    = f3.readline().rstrip()
                next(f3)
                score       = f3.readline().rstrip()
                reverseDict[label] = {"sequence" : sequence,
                                    "score"    : score   }
    return reverseDict

Tags: 脚本信息readline字典链接windowslabelscore
2条回答

如果您使用的是windows,那么最好使用任务管理器来增加专用RAM、线程或优先级的数量。但是,在Linux的任务管理器上,可以使用终端。我不熟悉确切的命令,所以你可能需要用谷歌搜索这些命令

我创建了一个100MB的小文件(比您的小得多,但格式类似),并使用namedtuple来提高内存性能。我还使用tracemalloc来了解使用了多少内存

import tracemalloc
tracemalloc.start()
createReverseDict("final.txt")
current, peak = tracemalloc.get_traced_memory()
print(f"Current memory usage is {current / 10**6}MB; Peak was {peak / 10**6}MB")
tracemalloc.stop()

对于这里的常规词典reverseDict[label] = dict(sequence = sequence, score = score),我的跑步记录如下

    Current memory usage is 0.020237MB; Peak was 1210.024309MB

通过使用collections.namedtuple,它减少了很多。几乎一半

    import collections
    item = collections.namedtuple('item', ['seq', 'sco'])

    reverseDict[label] = item(sequence, score)

函数内部。内存使用率下降到

    Current memory usage is 0.003773MB; Peak was 760.651005MB

如果你这样做了,也许OOM杀手根本就不会出现。但是,如果确实如此,您可以使用this link中的详细信息来提高OOM限制。使用完全禁用它

sysctl vm.overcommit_memory=2

我不能保证这是多么安全,但你应该能够尝试它,一旦你做了重新启动系统,让它回到默认值

相关问题 更多 >