在特别大的数据里你是怎么判断字符串是否存在的?

时间:2023-01-04 17:11:20
我需要不断的采集一些网址,采集后我存在哪里比较好?直接存在控件?还是txt里?然后我后面采集的网址还需要判断这个网址是否已经存在了。可以肯定的是  随着程序的运行,肯定存储的数据是越来越多的,那么我存在哪里会比较好呢?如果我存在数据库每次采集回来一个网址都要读取数据库,岂不是很麻烦吗?如果我存在txt  内存不够怎么办呢?保守估计   我能采集几百万上千万的网址,预计存在txt里会有大概几百兆吧,就是对这里没什么好的主意,有做过类似东西的同学给个思路吗?

15 个解决方案

#1


对这种需求,hash表最合适不过了

#2


数据库是必须的,做软件的不能怕麻烦.

#3


  几百兆,小意思了
至于存数据库,还是不存数据库,其实无所谓!
这点数据存数据库里,就是不做索引都无压力,如果做了索引就更无压力了

至于你担心地问题,其实你只要稍微了解一下,B tree,hash,索引这类知识,你就会明白,其实数据库也不会真傻到全表遍历这样几百万数据这样的操作

反倒是现在那个高大上地号称是大数据之神地hadoop是采用全表(至少是大部分表)地操作,不过人家的目标不同---他其实更应该叫大量文件处理比较合理(每个数据到不会太大地离谱,但是文件多地离谱)

#4


至于存入动作,如果太过频繁,通常采用多次缓存,一次存入这样的策略。

#5


引用 2 楼 tcmakebest 的回复:
数据库是必须的,做软件的不能怕麻烦.

每次去重复都要检测一下数据库里是否有这个网址  那得连接多少次数据库呀。。。。

#6


我觉得还是要数据库
犯不上每条网址的查询都要连接数据库的,你可以在程序启动的时候从数据库中将数据读到内存对象,采集的时候只要在内存对象中进行查询就可以了,不存在的网址就插入内存对象,譬如满了一百个就批量存到数据库。

#7


这个用redis内存数据库吧

#8


呵呵,你把计算机当人看了,计算机的长处就是处理枯燥地简单劳动

商业数据的设计标准,起码都是每秒并发千次。所以连接数据库次数有多大,不是你考虑的问题,哪怕你需要连接上亿次只要你保证不是每秒并发超过人家设计标准就ok了

ps:你真需要每秒上千次么??其实不会滴,查询去重,异步线程池,你能每秒100次就已经很了不起了,如果真达到每秒并发几千次,你的系统将会被彻底地重构了

#9


1、我能采集几百万上千万的网址,预计存在txt里会有大概几百兆吧
不说多,就几百万个网址吧,按几百兆计算,一个网址也就百十来的字符内容。这现实吗?
2、无论你存在哪里,只要你打算检查某个网址是否已经处理过了,那就必然有一个检索过程
你只需要找一个适合快速检索的数据结构,存放已处理过的网址就可以了
3、大量的采集,必定不是一个程序一次运行就可完成的。所以你需要有可共享的数据载体,以便多个程序同时进行处理
4、显然自己从0开始写一个这样的存储系统是划不来的,既然有现成的数据库系统(基于内存的 noSQL也是数据库)可用,为何不去用一下呢?

如果我存在数据库每次采集回来一个网址都要读取数据库,岂不是很麻烦吗?
这个想法、做法本身就是欠妥的
实际上,数据库在这里充当了重要角色
采集程序从数据库中读取未采集的网址,采集回数据存入数据库
分析程序从数据库中读取未分析的数据进行分析,解析出其中的连接存入数据库,供采集程序使用
只要数据库里有需要处理的数据,整个过程就会循环往复的进行

#10


引用 8 楼 wanghui0380 的回复:
呵呵,你把计算机当人看了,计算机的长处就是处理枯燥地简单劳动

商业数据的设计标准,起码都是每秒并发千次。所以连接数据库次数有多大,不是你考虑的问题,哪怕你需要连接上亿次只要你保证不是每秒并发超过人家设计标准就ok了

ps:你真需要每秒上千次么??其实不会滴,查询去重,异步线程池,你能每秒100次就已经很了不起了,如果真达到每秒并发几千次,你的系统将会被彻底地重构了


按照你的说法  几百兆都不算大的话 那我直接把这些数据存到变量里不行吗  直接就能比较了  免去了每次从数据库读取的烦恼  我不是很喜欢使用数据库去存储东西  总觉得数据库太慢了。。。   我可以将每个网址都存到listbox里  然后每获取一个网址就判断这个网址是否存在于listbox控件里 这样可以吗?  如果这样可以的话 应该怎么判断网址存在listbox里呢?网上有for循环的案例。。。但是我觉得那样未免也太慢了     还有。不知道我觉得数据库慢的想法是不是错误的...

#11


引用 9 楼 xuzuning 的回复:
1、我能采集几百万上千万的网址,预计存在txt里会有大概几百兆吧
不说多,就几百万个网址吧,按几百兆计算,一个网址也就百十来的字符内容。这现实吗?
2、无论你存在哪里,只要你打算检查某个网址是否已经处理过了,那就必然有一个检索过程
你只需要找一个适合快速检索的数据结构,存放已处理过的网址就可以了
3、大量的采集,必定不是一个程序一次运行就可完成的。所以你需要有可共享的数据载体,以便多个程序同时进行处理
4、显然自己从0开始写一个这样的存储系统是划不来的,既然有现成的数据库系统(基于内存的 noSQL也是数据库)可用,为何不去用一下呢?

如果我存在数据库每次采集回来一个网址都要读取数据库,岂不是很麻烦吗?
这个想法、做法本身就是欠妥的
实际上,数据库在这里充当了重要角色
采集程序从数据库中读取未采集的网址,采集回数据存入数据库
分析程序从数据库中读取未分析的数据进行分析,解析出其中的连接存入数据库,供采集程序使用
只要数据库里有需要处理的数据,整个过程就会循环往复的进行




很感谢版主来回答我的问题,我现在就是想找一个最优的解决方案去解决这个问题   现在大家给的答案都是通过数据库来解决,但是我想直接将数据存在txt里  再读取txt来比较网址是否存在。 版主觉得这样解决是否是最优的?

#12


引用 10 楼 jak1994 的回复:
按照你的说法  几百兆都不算大的话 那我直接把这些数据存到变量里不行吗  直接就能比较了  免去了每次从数据库读取的烦恼  我不是很喜欢使用数据库去存储东西  总觉得数据库太慢了。。。   我可以将每个网址都存到listbox里  然后每获取一个网址就判断这个网址是否存在于listbox控件里 这样可以吗?  如果这样可以的话 应该怎么判断网址存在listbox里呢?网上有for循环的案例。。。但是我觉得那样未免也太慢了     还有。不知道我觉得数据库慢的想法是不是错误的...


你又误入歧途了,你还没理解他的意思,你就直接存到数据库,对于每个采集来的新网址来说,你的查询sql语句很简单的,并且数据库对查询是有复用功能的,第一次查的时间会稍稍多一点,但后面的会很快,你也可以通过创建索引、将查询语句放到存储过程来优化检索速度,总之,你太小瞧数据库的能力了。

#13


引用 12 楼 ajianchina 的回复:
Quote: 引用 10 楼 jak1994 的回复:

按照你的说法  几百兆都不算大的话 那我直接把这些数据存到变量里不行吗  直接就能比较了  免去了每次从数据库读取的烦恼  我不是很喜欢使用数据库去存储东西  总觉得数据库太慢了。。。   我可以将每个网址都存到listbox里  然后每获取一个网址就判断这个网址是否存在于listbox控件里 这样可以吗?  如果这样可以的话 应该怎么判断网址存在listbox里呢?网上有for循环的案例。。。但是我觉得那样未免也太慢了     还有。不知道我觉得数据库慢的想法是不是错误的...


你又误入歧途了,你还没理解他的意思,你就直接存到数据库,对于每个采集来的新网址来说,你的查询sql语句很简单的,并且数据库对查询是有复用功能的,第一次查的时间会稍稍多一点,但后面的会很快,你也可以通过创建索引、将查询语句放到存储过程来优化检索速度,总之,你太小瞧数据库的能力了。


数据库用什么比较好一点?  我们以前都是用的php+mysql  不知道c#用什么来配合会好一点呢?

#14


sqlserver

#15


引用 14 楼 ajianchina 的回复:
sqlserver

感谢!!!

感谢各位帮忙解答的大牛!!!结贴了~

#1


对这种需求,hash表最合适不过了

#2


数据库是必须的,做软件的不能怕麻烦.

#3


  几百兆,小意思了
至于存数据库,还是不存数据库,其实无所谓!
这点数据存数据库里,就是不做索引都无压力,如果做了索引就更无压力了

至于你担心地问题,其实你只要稍微了解一下,B tree,hash,索引这类知识,你就会明白,其实数据库也不会真傻到全表遍历这样几百万数据这样的操作

反倒是现在那个高大上地号称是大数据之神地hadoop是采用全表(至少是大部分表)地操作,不过人家的目标不同---他其实更应该叫大量文件处理比较合理(每个数据到不会太大地离谱,但是文件多地离谱)

#4


至于存入动作,如果太过频繁,通常采用多次缓存,一次存入这样的策略。

#5


引用 2 楼 tcmakebest 的回复:
数据库是必须的,做软件的不能怕麻烦.

每次去重复都要检测一下数据库里是否有这个网址  那得连接多少次数据库呀。。。。

#6


我觉得还是要数据库
犯不上每条网址的查询都要连接数据库的,你可以在程序启动的时候从数据库中将数据读到内存对象,采集的时候只要在内存对象中进行查询就可以了,不存在的网址就插入内存对象,譬如满了一百个就批量存到数据库。

#7


这个用redis内存数据库吧

#8


呵呵,你把计算机当人看了,计算机的长处就是处理枯燥地简单劳动

商业数据的设计标准,起码都是每秒并发千次。所以连接数据库次数有多大,不是你考虑的问题,哪怕你需要连接上亿次只要你保证不是每秒并发超过人家设计标准就ok了

ps:你真需要每秒上千次么??其实不会滴,查询去重,异步线程池,你能每秒100次就已经很了不起了,如果真达到每秒并发几千次,你的系统将会被彻底地重构了

#9


1、我能采集几百万上千万的网址,预计存在txt里会有大概几百兆吧
不说多,就几百万个网址吧,按几百兆计算,一个网址也就百十来的字符内容。这现实吗?
2、无论你存在哪里,只要你打算检查某个网址是否已经处理过了,那就必然有一个检索过程
你只需要找一个适合快速检索的数据结构,存放已处理过的网址就可以了
3、大量的采集,必定不是一个程序一次运行就可完成的。所以你需要有可共享的数据载体,以便多个程序同时进行处理
4、显然自己从0开始写一个这样的存储系统是划不来的,既然有现成的数据库系统(基于内存的 noSQL也是数据库)可用,为何不去用一下呢?

如果我存在数据库每次采集回来一个网址都要读取数据库,岂不是很麻烦吗?
这个想法、做法本身就是欠妥的
实际上,数据库在这里充当了重要角色
采集程序从数据库中读取未采集的网址,采集回数据存入数据库
分析程序从数据库中读取未分析的数据进行分析,解析出其中的连接存入数据库,供采集程序使用
只要数据库里有需要处理的数据,整个过程就会循环往复的进行

#10


引用 8 楼 wanghui0380 的回复:
呵呵,你把计算机当人看了,计算机的长处就是处理枯燥地简单劳动

商业数据的设计标准,起码都是每秒并发千次。所以连接数据库次数有多大,不是你考虑的问题,哪怕你需要连接上亿次只要你保证不是每秒并发超过人家设计标准就ok了

ps:你真需要每秒上千次么??其实不会滴,查询去重,异步线程池,你能每秒100次就已经很了不起了,如果真达到每秒并发几千次,你的系统将会被彻底地重构了


按照你的说法  几百兆都不算大的话 那我直接把这些数据存到变量里不行吗  直接就能比较了  免去了每次从数据库读取的烦恼  我不是很喜欢使用数据库去存储东西  总觉得数据库太慢了。。。   我可以将每个网址都存到listbox里  然后每获取一个网址就判断这个网址是否存在于listbox控件里 这样可以吗?  如果这样可以的话 应该怎么判断网址存在listbox里呢?网上有for循环的案例。。。但是我觉得那样未免也太慢了     还有。不知道我觉得数据库慢的想法是不是错误的...

#11


引用 9 楼 xuzuning 的回复:
1、我能采集几百万上千万的网址,预计存在txt里会有大概几百兆吧
不说多,就几百万个网址吧,按几百兆计算,一个网址也就百十来的字符内容。这现实吗?
2、无论你存在哪里,只要你打算检查某个网址是否已经处理过了,那就必然有一个检索过程
你只需要找一个适合快速检索的数据结构,存放已处理过的网址就可以了
3、大量的采集,必定不是一个程序一次运行就可完成的。所以你需要有可共享的数据载体,以便多个程序同时进行处理
4、显然自己从0开始写一个这样的存储系统是划不来的,既然有现成的数据库系统(基于内存的 noSQL也是数据库)可用,为何不去用一下呢?

如果我存在数据库每次采集回来一个网址都要读取数据库,岂不是很麻烦吗?
这个想法、做法本身就是欠妥的
实际上,数据库在这里充当了重要角色
采集程序从数据库中读取未采集的网址,采集回数据存入数据库
分析程序从数据库中读取未分析的数据进行分析,解析出其中的连接存入数据库,供采集程序使用
只要数据库里有需要处理的数据,整个过程就会循环往复的进行




很感谢版主来回答我的问题,我现在就是想找一个最优的解决方案去解决这个问题   现在大家给的答案都是通过数据库来解决,但是我想直接将数据存在txt里  再读取txt来比较网址是否存在。 版主觉得这样解决是否是最优的?

#12


引用 10 楼 jak1994 的回复:
按照你的说法  几百兆都不算大的话 那我直接把这些数据存到变量里不行吗  直接就能比较了  免去了每次从数据库读取的烦恼  我不是很喜欢使用数据库去存储东西  总觉得数据库太慢了。。。   我可以将每个网址都存到listbox里  然后每获取一个网址就判断这个网址是否存在于listbox控件里 这样可以吗?  如果这样可以的话 应该怎么判断网址存在listbox里呢?网上有for循环的案例。。。但是我觉得那样未免也太慢了     还有。不知道我觉得数据库慢的想法是不是错误的...


你又误入歧途了,你还没理解他的意思,你就直接存到数据库,对于每个采集来的新网址来说,你的查询sql语句很简单的,并且数据库对查询是有复用功能的,第一次查的时间会稍稍多一点,但后面的会很快,你也可以通过创建索引、将查询语句放到存储过程来优化检索速度,总之,你太小瞧数据库的能力了。

#13


引用 12 楼 ajianchina 的回复:
Quote: 引用 10 楼 jak1994 的回复:

按照你的说法  几百兆都不算大的话 那我直接把这些数据存到变量里不行吗  直接就能比较了  免去了每次从数据库读取的烦恼  我不是很喜欢使用数据库去存储东西  总觉得数据库太慢了。。。   我可以将每个网址都存到listbox里  然后每获取一个网址就判断这个网址是否存在于listbox控件里 这样可以吗?  如果这样可以的话 应该怎么判断网址存在listbox里呢?网上有for循环的案例。。。但是我觉得那样未免也太慢了     还有。不知道我觉得数据库慢的想法是不是错误的...


你又误入歧途了,你还没理解他的意思,你就直接存到数据库,对于每个采集来的新网址来说,你的查询sql语句很简单的,并且数据库对查询是有复用功能的,第一次查的时间会稍稍多一点,但后面的会很快,你也可以通过创建索引、将查询语句放到存储过程来优化检索速度,总之,你太小瞧数据库的能力了。


数据库用什么比较好一点?  我们以前都是用的php+mysql  不知道c#用什么来配合会好一点呢?

#14


sqlserver

#15


引用 14 楼 ajianchina 的回复:
sqlserver

感谢!!!

感谢各位帮忙解答的大牛!!!结贴了~