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

对大数据块进行排序的Python算法

对大数据块进行排序的Python算法,python,database,sqlite,sorting,ldif,Python,Database,Sqlite,Sorting,Ldif,我一直在网上寻找一种方法来对我拥有的数据(LDIF文件)进行排序,但我还没有找到我想要的。已经有一些程序可以完成这种排序,但它们在处理超大数据集时失败。对我来说,非常大的内存块大约相当于2GB的内存块,这会在使用ldifsort.pl脚本时耗尽内存,即使我有6GB的可用内存和更多GB的交换空间。因此,我希望编写一个程序,将数据块存储到硬盘上,对内存中的键进行排序,然后按排序顺序重新组装数据块。我想用python3,因为我正在努力学习这门语言。因此,如果有人对使用python3的基本策略或具体方法

我一直在网上寻找一种方法来对我拥有的数据(LDIF文件)进行排序,但我还没有找到我想要的。已经有一些程序可以完成这种排序,但它们在处理超大数据集时失败。对我来说,非常大的内存块大约相当于2GB的内存块,这会在使用ldifsort.pl脚本时耗尽内存,即使我有6GB的可用内存和更多GB的交换空间。因此,我希望编写一个程序,将数据块存储到硬盘上,对内存中的键进行排序,然后按排序顺序重新组装数据块。我想用python3,因为我正在努力学习这门语言。因此,如果有人对使用python3的基本策略或具体方法有任何建议,我将非常感谢您的帮助

我有包含LDAP数据的大型文本文件,基本上是(非常简化的)形式:

每个订阅服务器还有三个与之关联的块(我的示例代码只显示了与订阅服务器关联的另一个块),我希望在排序完成后将所有四个块放在一起

因此,如果我按以下顺序读取dn(为了简洁起见,与dn关联的数据是隐藏的):

我希望输出为:

dn: Subscriber=UniqueName1@domain.com;RestOfTree=node
dn: ProfileID=UniqueName1@domain.com;Subscriber=UniqueName1;RestOfTree=node
dn: Subscriber=UniqueName2@domain.com;RestOfTree=node
dn: ProfileID=UniqueName2@domain.com;Subscriber=UniqueName2;RestOfTree=node
dn: Subscriber=UniqueName3@domain.com;RestOfTree=node
dn: ProfileID=UniqueName3@domain.com;Subscriber=UniqueName3;RestOfTree=node
dn: Subscriber=UniqueName4@domain.com;RestOfTree=node
dn: ProfileID=UniqueName4@domain.com;Subscriber=UniqueName4;RestOfTree=node
我的一个想法是在python读取数据时使用sqlite3存储数据,然后在python中对键进行排序,然后使用查询再次从sqlite提取数据并将数据写入文件。但是我担心在sqlite中搜索密钥所花费的时间会过多。然后我想我可以在插入数据时对sqlite中的数据进行排序,但sqlite似乎不支持这一点,我不知道是否还有其他数据库系统支持这一点

任何帮助或指导都将不胜感激

感谢Zach建议只使用GNU排序而不是数据库系统。这是我在他的帮助下制定的解决方案

awk-f ldifformatter.awk LDAP数据文件*.ldif | sort-t\|-k1 | sed'1d;s/|/\n/g'>sorted.txt

其中ldifformatter.awk将所有换行符与“|”交换,顶层dn除外,用于排序

谢谢,
Rusty

我想知道SQLite是否真的不能胜任这项任务。但无论如何,您可以使用外部排序算法,例如Mergesort,以保持内存使用率较低

命令行实用程序可以对非常大的文本文件进行排序,而无需将它们完全读入内存(至少GNU版本可以)。但是,要使用它,您必须重新格式化数据,使每条记录(所有应保存在一起的记录)显示在一行上。如果记录看起来像这样:

dn: Subscriber=UniqueName1@domain.com;RestOfTree=node1|groups: 1|permissions: 1|IsActive: FALSE|Barring: TRUE||dn: ProfileID=UniqueName1@domain.com;Subscriber=UniqueName1;RestOfTree=node1|groups: 1|permissions: 1|ServiceProfile: Lemur
然后,
sort-t\|-k1
将完成这项工作


您可以用Python编写一个程序,以适当的格式将数据流式传输到临时文件中,使用调用
sort
,然后恢复原始格式。用于创建临时文件。

不应在内存中对数据进行排序。你可以用


Guido van Rossum写了一篇关于同样问题的文章-。本文中有一些代码示例。

SQLite将在查找列被索引的情况下快速搜索关键字。顺序由订户名称中
@
前面的数字决定?@Bakuriu顺序由dn:和第一个;之间的所有内容决定;。域可用于排序。@RustyLemur那么您的输出是错误的。如果对字符串排序
Subscriber
配置文件ID后者应按字母数字顺序排在第一位。这些物品是如何分类的?我的猜测是按字母顺序对电子邮件进行排序,如果你有相同的电子邮件,那么首先是
订阅者
的,然后是
ProfileID
@Bakuriu对,你的想法是对的。每个“订阅者”都有与之关联的“ProfileID”,因此我希望所有订阅者都进行排序,并在ProfileID字段之前显示订阅者字段。感谢您的建议。我正在调查这件事。哇。我不知道GNU sort有那么强大。在ldifsort.pl由于内存耗尽而崩溃的地方,它工作得非常好:awk-f ldifsorter.awk dataFiles*.ldif | sort-t\|-k1 | sed'1d;s/|/\n/g'>sorted.ldif,其中ldifsorter.awk只是按照您的建议重新格式化数据。遗憾的是,python没有任何用处,但速度非常快。老实说,如果我自己也有这个问题,我会使用带有
awk
sed
的shell管道。我只是建议使用Python包装器,因为您对学习如何使用该语言进行操作感兴趣。
dn: Subscriber=UniqueName1@domain.com;RestOfTree=node
dn: ProfileID=UniqueName1@domain.com;Subscriber=UniqueName1;RestOfTree=node
dn: Subscriber=UniqueName2@domain.com;RestOfTree=node
dn: ProfileID=UniqueName2@domain.com;Subscriber=UniqueName2;RestOfTree=node
dn: Subscriber=UniqueName3@domain.com;RestOfTree=node
dn: ProfileID=UniqueName3@domain.com;Subscriber=UniqueName3;RestOfTree=node
dn: Subscriber=UniqueName4@domain.com;RestOfTree=node
dn: ProfileID=UniqueName4@domain.com;Subscriber=UniqueName4;RestOfTree=node
dn: Subscriber=UniqueName1@domain.com;RestOfTree=node1|groups: 1|permissions: 1|IsActive: FALSE|Barring: TRUE||dn: ProfileID=UniqueName1@domain.com;Subscriber=UniqueName1;RestOfTree=node1|groups: 1|permissions: 1|ServiceProfile: Lemur