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;
}
某一个系统中存在大量的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;
}
相关文章推荐
- php操作XML,读取数据和写入数据的方法
- 什么是沙盒模型?怎么写入、读取沙盒路径文件数据,哪些操作是属于私有api范畴
- STM32操作访问flash,包括写入数据到flash和从flash读取数据
- ios开发系列之文件的写入读取,NSUserDefaults存储数据,NSFileManager操作文件和文件夹
- 文件操作ofstream,open,close,ifstream,fin,依照行来读取数据, fstream,iosin iosout,fio.seekg(),文件写入和文件读写,文件拷贝和文件
- C#中NPOI操作excel之读取和写入excel数据
- android读写sd卡操作写入数据读取数据示例
- Java操作Excel之理解JXL--读取Excel模板动态写入数据并生成Excel
- java 对excel操作 读取、写入、修改数据;导出数据库数据到excel
- 读写锁的操作1(设计六个线程,三个线程写入数据,三个线程读取数据,请用读写锁进行操作)
- Nifi读取Hive中数据然后再写入新Hive数据库表操作
- 文件操作ofstream,open,close,ifstream,fin,按照行来读取数据, fstream,iosin iosout,fio.seekg(),文件写入和文件读写,文件拷贝和文件
- Hadoop URL数据读取操作
- QLite数据库的数据读取和写入 通过界面操作数据库
- 关于【finder不能完成该操作 因为未能读取或写入"文件名"中的某些数据(错误代码-36)】快速解决办法
- Hadoop文件系统操作之读取写入数据
- php操作XML、读取数据和写入数据的实现代码
- Java操作Excel之理解JXL--读取Excel模板动态写入数据并生成Excel
- HDFS的存储结构以及写入、读取hdfs数据操作流程简单总结
- C#中NPOI操作excel之读取和写入excel数据