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

/*
   某一个系统中存在大量的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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值