|
您需要 100 亿以内的素数表吗?
下面引用由天山草在 2011/07/09 00:36pm 发表的内容:
这种数据库技术真厉害,若是普通文本文件,前150万个素数即使“压缩”后,也仍有2176kb,跟人家相差几百倍。 下面引用由ysr在 2011/07/09 01:09pm 发表的内容:
数据库技术真厉害,能把30位以内的素数表全部储存吗? 在MySQL 数据库服务器中我开了一个数据库 MathDB
在MathDB 中我搞了一个数据表 prime
mysql> desc prime;
+----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+----------------+
| oid | int(10) unsigned | NO | PRI | NULL | auto_increment |
| pv | int(10) unsigned | YES | | NULL | |
| descript | text | YES | | NULL | |
+----------+------------------+------+-----+---------+----------------+
3 rows in set (0.80 sec)
其中 oid 是素数的序号,例如素数2的序号是1, 17 的序号是7等等。
我用以下 python 代码把 mathematica 生成的素数序列输入数据库:
===================================
#!F:/Python/bin/python
# -*- coding: utf-8 -*-
import MySQLdb as mdb
import sys
cnt = 0
cmdHead = "Insert into prime (pv) values "
cmdStr = cmdHead
try:
conn = mdb.connect(';localhost';, ';elim';, ';******';, ';mathdb';);
cursor = conn.cursor()
for line in open(';10m.txt';,';r';):
cnt = (cnt + 1)%200
var = int(line)
if var > 1:
cmdStr += ';(%d),'; % var
if cnt == 0:
if cmdStr[-1:] == ';,';:
cmdStr = cmdStr[:-1]
cursor.execute(cmdStr)
conn.commit()
cmdStr = cmdHead
if cmdStr[-1:] == ';,';:
cmdStr = cmdStr[:-1]
cursor.execute(cmdStr)
conn.commit()
cursor.close()
conn.close()
except mdb.Error, e:
print "Error %d: %s" % (e.args[0],e.args[1])
sys.exit(1)
================
实际运用表明,如果 10m.txt 有一亿个素数 (此时文档有一个多 Gb!),这个程序还是可以胜任。
这么说来,只要硬盘空间和内存OK, 这个方法还是可以把mathematica 生成的数据存入数据库的。(这件事让人干是要人命的)。
我说前150万个素数占用了8k,虽然不是要吹,却是错了。新的数据库把数据信息放到了两个地方,一是表格文件,二是一个诸表共用的文件ibdata1,而老的数据库却只放在数据表文件中。所以那个说法不正确,到底占多大空间现在变得不易知道了。另外,为了优化数据库询问的速度,不仅素数数据,还有 index 信息也需要空间...
不管如何,把素数数据存入数据库的好处是显然的。例如我们要得到前五百个素数中的孪生素数对
mysql> select t1.pv p1, t1.pv+2 p2 from prime t1
-> where t1.oid<500 and exists
-> (select t2.pv from prime t2 where t2.pv = 2+t1.pv);
+------+------+
| p1 | p2 |
+------+------+
| 3 | 5 |
| 5 | 7 |
| 11 | 13 |
| 17 | 19 |
| 29 | 31 |
| 41 | 43 |
| 59 | 61 |
| 71 | 73 |
| 101 | 103 |
| 107 | 109 |
| 137 | 139 |
| 149 | 151 |
| 179 | 181 |
| 191 | 193 |
| 197 | 199 |
| 227 | 229 |
| 239 | 241 |
| 269 | 271 |
| 281 | 283 |
| 311 | 313 |
| 347 | 349 |
| 419 | 421 |
| 431 | 433 |
| 461 | 463 |
| 521 | 523 |
| 569 | 571 |
| 599 | 601 |
| 617 | 619 |
| 641 | 643 |
| 659 | 661 |
| 809 | 811 |
| 821 | 823 |
| 827 | 829 |
| 857 | 859 |
| 881 | 883 |
| 1019 | 1021 |
| 1031 | 1033 |
| 1049 | 1051 |
| 1061 | 1063 |
| 1091 | 1093 |
| 1151 | 1153 |
| 1229 | 1231 |
| 1277 | 1279 |
| 1289 | 1291 |
| 1301 | 1303 |
| 1319 | 1321 |
| 1427 | 1429 |
| 1451 | 1453 |
| 1481 | 1483 |
| 1487 | 1489 |
| 1607 | 1609 |
| 1619 | 1621 |
| 1667 | 1669 |
| 1697 | 1699 |
| 1721 | 1723 |
| 1787 | 1789 |
| 1871 | 1873 |
| 1877 | 1879 |
| 1931 | 1933 |
| 1949 | 1951 |
| 1997 | 1999 |
| 2027 | 2029 |
| 2081 | 2083 |
| 2087 | 2089 |
| 2111 | 2113 |
| 2129 | 2131 |
| 2141 | 2143 |
| 2237 | 2239 |
| 2267 | 2269 |
| 2309 | 2311 |
| 2339 | 2341 |
| 2381 | 2383 |
| 2549 | 2551 |
| 2591 | 2593 |
| 2657 | 2659 |
| 2687 | 2689 |
| 2711 | 2713 |
| 2729 | 2731 |
| 2789 | 2791 |
| 2801 | 2803 |
| 2969 | 2971 |
| 2999 | 3001 |
| 3119 | 3121 |
| 3167 | 3169 |
| 3251 | 3253 |
| 3257 | 3259 |
| 3299 | 3301 |
| 3329 | 3331 |
| 3359 | 3361 |
| 3371 | 3373 |
| 3389 | 3391 |
| 3461 | 3463 |
| 3467 | 3469 |
| 3527 | 3529 |
| 3539 | 3541 |
| 3557 | 3559 |
+------+------+
96 rows in set (0.08 sec)
|
|