设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
12
返回列表 发新帖
楼主: 九夜神尊
打印 上一主题 下一主题

[已经解决] 【高手进】数据库问题

 关闭 [复制链接]

Lv3.寻梦者

梦石
0
星屑
1323
在线时间
831 小时
注册时间
2007-12-25
帖子
1558
11
 楼主| 发表于 2011-7-24 23:17:32 | 只看该作者
苏小脉 发表于 2011-7-24 22:50
如果你已经有一套管理数据的方案,那想必 Marshal.dump(obj) 就足够了。当管理、执行效率跟不上时,就可 ...

我查看了一下你说的那个Marshal。这种玩意是按先后顺序写入,然后按先后顺序读出。

也许我要换一个方式表达我的需要了。
1:建立一个数据库(假设命名为database)
可以存入数据(以下方法名乱写的。)
save_data(对象,对象的索引,database)
save_data(对象2,对象2的索引,database)
save_data(对象3,对象3的索引,database)
save_data(对象4,对象4的索引,database)
以上,可以在任何时候春存入对象
当然也可以任何时候读出对象

obj = load_data(对象3的索引,database)
就可以读出对象3。

重要的是不用载入整个数据库的所有数据,写入也不需要覆盖整个数据库。
计划这个数据库内容好几个G,如果是Marshal……你懂得。
精卫赤龙腾   
总是存在一种强大,去完成似乎不可能的事情.
无畏战乾程   
或是需要一种勇气,去挑战几乎不存在的胜利.
一味玄真魂     
这是拥有一种恒心,去化解根本没有解的困难.
烈卫开天径    
只是带着一种决心,去争取残存的最后的希望。
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
115
在线时间
953 小时
注册时间
2007-4-25
帖子
805
12
发表于 2011-7-25 04:47:04 | 只看该作者
九夜神尊 发表于 2011-7-24 23:17
我查看了一下你说的那个Marshal。这种玩意是按先后顺序写入,然后按先后顺序读出。

也许我要换一个方式 ...

我不太清楚这是否就是你的所有需求,如果唯一的变量是对象索引的话,你把索引嵌入到文件名中,装载的时候去查找文件名是对应索引的文件就行了,这种简单的需求还是可以用 Marshal 实现的。如果你还有更复杂的需求,比如仅仅查询符合特定属性的对象 [1],那最好还是弄一个 DBMS,虽然你目前的需求可能只会用到一个表。在需要把数据库嵌入到应用程序里而不是作为独立的服务程序时,大多数人会选择 SQLite。

[1] 即检查对象各种属性而不仅仅是单一的一个标识,如从数据库中查询 obj.field1 + obj.field2 > 5 的所有 obj。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1357
在线时间
677 小时
注册时间
2009-11-11
帖子
2790
13
发表于 2011-7-25 10:42:47 | 只看该作者
所有东西 都 dump 到同一个文件中 ,对象多了 效率会不会下降?  文件会不会太大,当数据库用

估计大也不会大过100M吧

嘿。嘿。嘿
回复

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1323
在线时间
831 小时
注册时间
2007-12-25
帖子
1558
14
 楼主| 发表于 2011-7-25 12:35:19 | 只看该作者
苏小脉 发表于 2011-7-25 04:47
我不太清楚这是否就是你的所有需求,如果唯一的变量是对象索引的话,你把索引嵌入到文件名中,装载的时候 ...

每隔一对象只有唯一的索引。其实这些对象都应该是保存到内存中的,读取这些对象只需要得到对象的地址。
同理,保存在数据库内只是为了缓解内存的压力,这里的索引也就相当于内存的地址。
你说的那方法可行,不过那文件数量很大,几千几万的说。
精卫赤龙腾   
总是存在一种强大,去完成似乎不可能的事情.
无畏战乾程   
或是需要一种勇气,去挑战几乎不存在的胜利.
一味玄真魂     
这是拥有一种恒心,去化解根本没有解的困难.
烈卫开天径    
只是带着一种决心,去争取残存的最后的希望。
回复

使用道具 举报

Lv1.梦旅人

彩色的银子

梦石
0
星屑
50
在线时间
190 小时
注册时间
2006-6-13
帖子
1361

贵宾

15
发表于 2011-7-25 13:14:25 | 只看该作者
真那么大的话,用sqlite吧。
-.-
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
115
在线时间
953 小时
注册时间
2007-4-25
帖子
805
16
发表于 2011-7-25 13:19:39 | 只看该作者
九夜神尊 发表于 2011-7-25 12:35
每隔一对象只有唯一的索引。其实这些对象都应该是保存到内存中的,读取这些对象只需要得到对象的地址。
...
保存在数据库内只是为了缓解内存的压力,这里的索引也就相当于内存的地址。

可以这么做,但是要注意反序列化之后,重新分配的地址就不会再和序列化后的索引所代表的地址一致了。如果每次都用对象本身的内存地址,那在反复保存 -> 读取 -> 保存后就会产生很多副本。这种情况下还是得额外开辟一个对象的域用以保存其唯一标识,这样就能保证对象的身份在不断的转储过程中一直都能持久。

不过那文件数量很大,几千几万的说。

这又回到我之前说的性能的问题了。用程序语言标准库提供的接口可以在本地文件系统(NTFS、FAT、ext2、ext3、……)之上进行简单的文件名匹配,但这通常比 DBMS 直接通过 block I/O 进行的数据库操作效率低。是否为了执行效率而复杂化工程结构,唯子实图利之。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2025-1-11 00:16

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表