您的位置:首页 > 大数据

URL写入操作中存在很大数据量时的读取和写入

2008-11-13 12:26 281 查看
/*

某一个系统中存在大量的url串,串的长度不超过50个字符,数量大概有1000万以上,现需要从系统中读取所有

的数据,数据量很大,但是这个工作每一个小时才进一次,同时还需要向系统中写入数据,大概是每分钟10万条。

所有的数据存储在硬盘上,硬盘是一种慢存储设备,最大存储速度不超过100M/S。

不考虑数据库容量问题,当数据库中数据超过容量后会自动删除重写。现在请你设计一种数据结构来存储上述

数据,并提供"读取数据"和"写入数据"的操作。(写清思路,可以尽量写些伪码和流程图)

*/

/*

分析:系统中数据量很大,1000万以上的数据量,每个小时读取一次,每分钟还要向里面存入10万条的数据。

每小时读取所有的数据,读出的数据放入日志或者供搜索引擎来处理,每次读出所有的数据需要多少的时间呢,

粗略估算一下 串的长度为50 个字符,每个字符占用一个字节,每个串是50个字节 即:50B 假设有一千万的url

串,总容量为50B* 10000000 = 500000000B = 500M 所有的串的容量为500M,硬盘的写入速度最多为100M/S,

所以每次读取数据并写入日志的时间为秒级单位。

当每小时读取数据时可能会涉及到同时写入数据,这个时候可以考虑会向系统中写入数据,这时可以将数据

存入缓冲区队列,当读操作结束时再将数据写入系统。

*/

typedef struct url

{

char * value = (char * )malloc(50*sizeof(char));//存储串的值

bool ifRead = false;//是否被读过

url * next;//存储当前字符串的下一个串的指针

} * URL;

static bool WorkTag = 0;// 设定工作标签变量,默认的标量值为0,即为写状态,当标量值为1,即为读状态,

//状态之间的切换可以采用类似于操作系统中的P 、 V物语,一个程序结束是另一个程序开始的条件

static URL head = NULL; //设置全局的头指针,初始为空

static URL current = NULL; //设置当前的读取的头指针

void Read(URL head)

{

URL p = head;

while(1)

{

if (p->next = NULL)

{

curent = p; //读操作结束,保存当前存取的指针,继续写操作

head = p;

break;

}

p -> ifRead = true; // 将此时的元素设置为已读

p = p->next;

}

V(); // 进入写操作

}

void Write(URL current)

{

URL p = current;

Timer t =0; //设置定时器

while(1)

{

if (t == 3600) break; //当达到一个小时后,跳出循环

URL a;

a->value = "写入的字符串";

p->next = a;

p = p->next;

}

P(); // 进入读操作

}

void P()

{

WorkTag = 1;

Read(head);

}

void V()

{

WorkTag = 0;

Write(current);

}

int main()

{

while (1)

{

Write(current);

Read(head);

if(error_happen) break;

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐