Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.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_Regex_Linux_Python 2.7 - Fatal编程技术网

Python 无法在内存中存储大字符串

Python 无法在内存中存储大字符串,python,regex,linux,python-2.7,Python,Regex,Linux,Python 2.7,我有以下格式的数据: #@ De A B C. #@ dabc xyz def ghi. #@ <MyName_1> Here is example. #@ Df A B C. #@ <MyName_2> De another one. #@ <MyName_3> Df next one. #@ dabc1 xyz def ghi. #@ <MyName_4> dabc this one. A B#1 C. //step 1 -- 1 assig

我有以下格式的数据:

#@ De
A B C.
#@ dabc
xyz def ghi.
#@ <MyName_1>
Here is example.
#@ Df
A B C.
#@ <MyName_2>
De another one.
#@ <MyName_3>
Df next one.
#@ dabc1
xyz def ghi.
#@ <MyName_4>
dabc this one.
A B#1 C. //step 1 -- 1 assigned to the first occurrence of A B C.
xyz def#1 ghi. //1 assigned to first occurrence of xyz def ghi
Here is example
A B#2 C. //step 1 -- 2 assigned in increasing order
B#1 another one. //step 2
B#2 next one.
xyz def ghi.
def#1 this one.
//此处代表注释,不属于输出的一部分

算法如下所示

  • 如果#@后面的第二行被重复。然后,附加到 中间词#number,其中number是数字标识符,是 按第二行重复的递增顺序分配
  • 替换#@。。。用“数字”这个词
  • 删除第二行不重复的所有#@

  • 为了实现这一点,我存储了所有的三元组,然后找到它们的出现点,以便按递增顺序分配数字。在python中是否有其他方法可以实现同样的效果。实际上,我的文件是500GB,不可能将所有三元组都存储在内存中以查找它们的出现处。

    如果您需要类似于dict的内容,但太大而无法保存在内存中,则需要一个键值数据库

    最简单的方法是使用
    dbm
    类型库,这是一个非常简单的键值数据库,其接口几乎与
    dict
    完全相同,只是它只允许键值和值的字符串,并有一些额外的方法来控制持久性和缓存等。根据您的平台和Python 2.7的构建方式,您可能有以下几种情况:

    如果您的Python安装不包括后三个版本,只要您拥有相关版本的libbsddb并且其许可证没有任何问题,那么后三个版本都可以在PyPI上使用

    问题在于,根据您的平台,各种底层数据库库可能不存在(当然您可以下载C库,安装它,然后构建并安装Python包装器),或者可能不支持这么大的数据库,或者可能这样做,但效率极低(或者,在少数情况下,以错误的方式…)

    希望其中一个对你有用,但你真正知道的唯一方法是测试你所有的

    当然,如果我理解正确的话,你是在把字符串映射到整数,而不是字符串。您可以使用这个模块,它包装了任何类似于
    dbm
    的库,允许您使用字符串键,但任何可拾取为值的东西……但对于这样的情况,这是一个巨大的过度杀伤力(可能会破坏您的性能);您只需更改如下代码:

    counts.setdefault(key, 0)
    counts[key] += 1
    
    …进入此:

    counts.setdefault(key, '0')
    counts[key] = str(int(counts[key]) + 1)
    
    当然,您可以轻松地编写一个包装器类来完成这项工作(甚至可能是一个支持
    计数器
    接口而不是
    dict
    接口的包装器类)


    如果这不起作用,您需要一个更强大的数据库

    大多数Python的构建都是在stdlib中提供的,但是使用它需要学习一个相当低级的API,以及学习SQL,这是一种完全不同于Python的语言。(也有各种不同的关系数据库,但您不需要它们中的任何一个。)

    还有各种各样的查询表达式库,甚至还有完整的对象关系映射器,比如(可以使用任何一种方式),它们可以让您以一种更具python风格的方式编写查询,但它仍然没有使用
    dict
    dbm
    那么简单。(也就是说,围绕
    SQLAlchemy
    包装一个类似
    dbm
    的接口并不难)


    还有各种各样的非关系型或半关系型数据库通常被归为这个术语,其中最简单的数据库基本上是基于类固醇的
    dbm
    。同样,它们通常需要学习一个相当低级的API,有时还需要学习一种查询语言,但其中一些会有很好的Python库,使它们更易于使用。

    @JoranBeasley Ok。你能说明一下如何使用数据库做同样的事情吗?因为我是pythonh中使用数据库的新手。第二行是如何从
    abc.
    转换到
    ab1c.
    ?(我猜
    /
    注释不是输出的一部分?)我看不出这三条规则中的任何一条会发生。@abamert是的,您是正确的//是注释。我使用它们是为了说明这一点。如果所有其他方法都失败了,那么使用64位版本的Python就可以了。同时,您的文件为500GB并不一定意味着这会占用太多内存;这取决于你有多少不同的三元组。那是多少?您确定没有以其他方式浪费内存吗(例如,在处理之前将整个文件存入内存,或者构建一个巨大的列表而不是一次只写一行,等等)?