文字MUD游戏论坛-天下泥潭群英会-水泊梁山  

返回   文字MUD游戏论坛-天下泥潭群英会-水泊梁山 > 西游之旅 > 『 巫师天下 』

『 巫师天下 』 学习如何挂MUD,如何制作MUD。讨论如何管理好一个MUD,做好一个巫师。

发表新主题 回复
 
LinkBack 主题工具 主题评分 显示模式
旧 2011-12-03   #1
高级会员
级别:6 | 在线时长:109小时 | 升级还需:31小时级别:6 | 在线时长:109小时 | 升级还需:31小时级别:6 | 在线时长:109小时 | 升级还需:31小时
 
Odysseus 的头像
 
注册: 08年04月11日
来自: 盘丝洞
帖子: 311
声望力: 20
声望: 50 Odysseus 初领妙道
现金:29两梁山币
资产:1245两梁山币
致谢数: 0
获感谢文章数:0
获会员感谢数:0
大量数据存储和读取的问题

作者:jjgod  发表时间:2001年8月1日 12:08

--------------------------------------------------------------------------------

这个问题一直比较迷惑,比如 read_file 最多可以读多长
的文件,write_file 最多可以写多长的文件,save_object
最多可以存多大的内容。

最近在写一个取 mudlib 内所有文件进行时间比较的程序中
遇到了这个问题。这个程序主要是想取得所有文件的
last_touched_time 进行保存,下次进行此操作时再把目前
的信息与上次保存的信息进行比较,列出修改过的文件。比
如说我用下面的程序列出所有 / 下的文件:
string *deep_file_list(string dir)
{
int i;
string *flist, *result = ({ }), file;

if (member_array(dir, exclude_dir) != -1)
{
return ({ });
}
flist = get_dir(dir);

for (i = 0; i < sizeof(flist); i++)
{
file = dir + flist[i];

if (file_size(file + "/") == -2)
result += deep_file_list(file + "/");
else
result += ({ file });
}

return result;
}

然后再用下面的程序生成一个 mapping:
private void build_version()
{
string *flist;
int i, max;

flist = deep_file_list("/");
max = sizeof(flist);
file_info = ([ ]);

for (i = 0; i < max; i++)
{
if (! i % 100)
reset_eval_cost();

file_info[flist[i]] = stat(flist[i])[1];
}
return;
}

一开始,我是继承了 F_SAVE,想用 save(); 来保存,结果
是存盘文件中除了 #/xxx/xxxx/xxx.c 之外没有任何数据,
于是我尝试用 write_file 的方法,即如下程序:
int save()
{
string info;
int i;
string *key;

if (! mapp(file_info) || ! sizeof(file_info))
return 0;

info = sprintf("version : %d\n", version);
key = keys(file_info);
for (i = 0; i < sizeof(file_info); i++)
{
info += sprintf("%s : %d\n", key[i], file_info[key[i]]);
}
return write_file(VERSION_FILE, info, 1);
}
写入是成功的,文件大概有将近 300K(我以前用 save_object
则保存过 150K 左右的文件)。

但是,用 read_file 来读这整个文件返回的是 0,于是我只好
用如下程序一行一行地来读:
void restore()
{
string info;
string file, line;
string *lines;
int time;
int i;

if (stringp(info = read_file(VERSION_FILE, 1, 1)))
{
sscanf(info, "version : %d", version);

for (i = 2; ; i++)
{
if (! stringp(line = read_file(VERSION_FILE, i, i)))
break;
if (sscanf(line, "%s : %d", file, time) == 2)
file_info[file] = time;
if (! i % 100)
reset_eval_cost();
}
}
}
以上程序经过测试确实使可以运行的,但运行起来就非常的慢
了,大概 save() + restore() 一次要半分钟。所以这里想问
问有没有更好的方法可以进行这种大容量的存储和读取?

--------------------------------------------------------------------------------
莫愁前路无知己,天下谁人不识君?

做成守护进程吧。


作者:Super  发表时间:2001年8月1日 16:19

--------------------------------------------------------------------------------

mapping file_info[];

int save(int t)
{
string info;
int i;
string *key;
int flag;

flag = 0;

if (memory_info() > 5000000) {
call_out("save",5);
return 1;
}

if (t > sizeof(file_info)) {t = sizeof(file_info);flag = 1;}

if (! mapp(file_info) || ! sizeof(file_info))
return 0;

info = sprintf("version : %d\n", version);
key = keys(file_info);
for (i = t; i < t ; i++)
{
info += sprintf("%s : %d\n", key[i], file_info[key[i]]);
}

remove_all_callout();

if (flag == 1) return write_file(VERSION_FILE,info);

call_out("save",0,t+30);

return 1;
}
void create()
{
set("id","Saver_Storer");
seteuid(geteuid());
}
void start_save() { save(0); }

int write_file(string filename,mixed info)
{
write("save file done!\n");
return ::write_file(filename,info);
}

这样储存时间虽然要长点,不过储存的时候应该感觉不到延迟的。
另外memory_info()的判断的大小,根据系统的负担而定。


re


作者:doing  发表时间:2001年8月1日 16:20

--------------------------------------------------------------------------------

save_object 可以保存 300k 的内容。至于 read_file 和 write_file 读写文件也没有
限制,完全看你的 buffer 或 string 的容量,这个是在配置里面指明的。

save_object 只是限制了递归的层次,这个也是在配置中指明的。
Odysseus 当前离线  
回复时引用此帖

发表新主题 回复

添加到书签


发帖规则
不可以发表主师
不可以回复帖子
不可以上传附件
不可以编辑自己的帖子

论坛启用 vB 代码
论坛启用 表情图标
论坛启用 [IMG] 代码
论坛禁用 HTML 代码
Trackbacks are 启用
Pingbacks are 启用
Refbacks are 启用



所有时间均为格林尼治时间 +9, 现在的时间是 10:33.


Powered by SPLS
版权所有 2001-2023 水泊梁山
皖ICP备05012024号

站长 fengyue

Content Relevant URLs by vBSEO 3.6.1