Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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中大型列表使用的内存_Python_List - Fatal编程技术网

如何减少python中大型列表使用的内存

如何减少python中大型列表使用的内存,python,list,Python,List,我正在写一个程序,它工作得很好,但是当它将数据库(一个100MB的文本文件)加载到一个列表中时,它的内存使用量变成了700-800MB 用于将文件加载到列表的代码: database = [] db = open('database/db.hdb') dbcontent = db.read() for line in dbcontent.split('\n'): line = line.split(':') database.append(line) 来自db.hdb的Snip

我正在写一个程序,它工作得很好,但是当它将数据库(一个100MB的文本文件)加载到一个列表中时,它的内存使用量变成了700-800MB

用于将文件加载到列表的代码:

database = []
db = open('database/db.hdb')
dbcontent = db.read()
for line in dbcontent.split('\n'):
    line = line.split(':')
    database.append(line)
来自db.hdb的Snipplet:

14200:917cb8a3d1d9eb24af6c5bcf3bf7e401:Trojan.Downloader-1420
7168:a105e2cc8148158cd048360eb847c7d0:Trojan.Downloader-1421
7168:c61ef67b5e7eef19ef732f55116742f6:Trojan.Downloader-1422
7168:851b6320148122104f50445ea2684c9f:Trojan.Downloader-1423
7168:ca128383c79a56d930eb4a7ff5026e31:Trojan.Downloader-1424
355204:4af89f8d219f94462cf2f8cb8eb4c6d7:Trojan.Bancos-2053
356984:2bfb53d76891059b79122e13d1537e4a:Trojan.Bancos-2054
363520:edbbdf497cda1ba79c06ea40673d963e:Trojan.Bancos-2055
367616:d85f719b032dbf39800d90ca881fd225:Trojan.Bancos-2056
370688:6cb572fd2452416dc4ea09e3ad917e66:Trojan.Bancos-2057
370688:ef34885677230061649d30ea66d7b0a1:Trojan.Bancos-2058
399360:8578b664706cfdc2f653680bac1b1b6e:Trojan.Bancos-2059
401408:de62af250b5a3e1ba1e9c517629383dd:Trojan.Bancos-2060
622592:8a236340c0a8c76343f6fb581314fadf:Trojan.Bancos-2061
622592:29f3499488ba1814c62fac3c2f3bda54:Trojan.Bancos-2062
622592:5d023bccf2ff097ccbc0ab0eab4a6ee7:Trojan.Bancos-2063
622592:3d6a25ed1f0e2001e72812ce1adf37d3:Trojan.Bancos-2064
622592:eaff242b601807e5805c189752d39124:Trojan.Bancos-2065
623104:8cd8e788d33cf40412d3346a525e4cce:Trojan.Bancos-2066
625152:25470d6895cb0e5c2e7181cb9a201ae0:Trojan.Bancos-2067
625152:436d574cef37b2e62d9b801b8fc2c4f1:Trojan.Bancos-2068
647168:51eb4e43f24cf511e6715cc8667babcd:Trojan.Bancos-2069
(完整文件约有1800000行)


如何减少内存使用

只要您不需要内存中的完整文件,您可以一次读取一行:

database = []
db = open('database/db.hdb')
line = db.readline()
while line:
    line = line.split(':')
    database.append(line)
    line = db.readline()

您应该将文件对象用作迭代器,以减少文件中的内存使用。然后可以将数据库列表分块处理,而不是全部处理。例如:

results = []
database = []
for line in open("database/db.hdb"):
    line = line.split(':')
    #You could then manage database in chunks?
    database.append(line)
    if len(database) > MAX:
        #dosomething with database list so far to get result
        results.append(process_database(database))
        database = []
#do something now with individual results to make one result
combine_results(results)

这取决于你将如何处理这些数据。您可以简单地逐个加载。或者购买更多的内存。:)现在800MB不再是一个问题。除非我有一个raspberry pi,它有512MB内存,并且不能升级:(,在我的windows pc上没有问题,但在raspberry pi上也是如此,我看不出你的数据库是一个列表,如何实现有意义的事情:搜索列表中的任何内容在时间上都是线性的——也就是说,如果你必须检查数据库中是否有给定的签名,你必须逐个检查所有项目。你至少应该使用字典nary并使用签名字段作为密钥,尽管我认为更简单的方法是使用sqlite,将数据放在一个单表sql数据库中。这样您就不会消耗内存,并获得更好的响应(boith sqlite3和OS缓存将为您提供性能)。谢谢!这减少了300MB使用的内存:d这不会像您认为的那样。将以字符串形式返回下一行,因此for循环将迭代该行中的字符。Python中的文件对象可以用作
for
循环中的迭代器-请参阅批准的答案。