我遇到了一个采访问题"如果你正在设计一个网络爬虫,你将如何避免进入无限循环?"我试图回答它.
这一切从一开始就是如何开始的.比如谷歌开始时,一些中心页面上说有数百个(首先如何找到这些中心页面是一个不同的子问题).当Google跟踪来自页面的链接等时,它是否继续制作哈希表以确保它不遵循先前访问过的页面.
如果同一页面有2个名称(URL),如果我们有URL缩短器等,那么该怎么办呢?
我以谷歌为例.虽然谷歌没有泄漏其网络爬虫算法和页面排名等的工作方式,但任何猜测?
search-engine large-data-volumes web-crawler google-search data-structures
我只需要使用Hibernate读取MySQL数据库中表中的每一行,并根据它编写一个文件.但是有9000万行,它们非常大.所以看起来以下是合适的:
ScrollableResults results = session.createQuery("SELECT person FROM Person person")
.setReadOnly(true).setCacheable(false).scroll(ScrollMode.FORWARD_ONLY);
while (results.next())
storeInFile(results.get()[0]);
Run Code Online (Sandbox Code Playgroud)
问题是上面将尝试将所有9000万行加载到RAM中,然后再转到while循环...这将使OutOfMemoryError消除我的内存:Java堆空间异常:(.
所以我猜ScrollableResults不是我想要的?处理这个问题的正确方法是什么?我不介意这个while循环需要几天(好吧我不喜欢它).
我想处理这个问题的另一种方法是使用setFirstResult和setMaxResults迭代结果,只使用常规的Hibernate结果而不是ScrollableResults.这感觉就像它效率低下一样,当我在8900万行中调用setFirstResult时,它将开始花费一段可笑的时间......
更新:setFirstResult/setMaxResults不起作用,事实证明需要花费相当长的时间才能达到我所担心的偏移量.这里一定有解决方案!这不是一个很标准的程序吗?我愿意放弃Hibernate并使用JDBC或其他任何东西.
更新2:我提出的解决方案哪个工作正常,不是很好,基本上是以下形式:
select * from person where id > <offset> and <other_conditions> limit 1
Run Code Online (Sandbox Code Playgroud)
由于我有其他条件,即使是索引中的所有条件,它仍然没有我想要的那么快......所以仍然可以提供其他建议..
我有大量的数据(几TB)并累积......它们包含在许多制表符分隔的平面文本文件中(每个大约30MB).大多数任务涉及读取数据并基于一系列谓词语句聚合(求和/平均+附加转换)观察/行,然后将输出保存为文本,HDF5或SQLite文件等.我通常使用R对于这样的任务,但我担心这可能有点大.一些候选解决方案是
(3)是个坏主意吗?我知道你可以在Python中包装C例程,但在这种情况下,因为没有任何计算上的限制(例如,需要许多迭代计算的优化例程),我认为I/O可能与计算本身一样是瓶颈.您对进一步的考虑或建议有什么建议吗?谢谢
编辑感谢您的回复.关于Hadoop的看法似乎存在冲突,但无论如何我都无法访问集群(虽然我可以使用几台未经网络的机器)......
我的应用程序可能传递了大量的参数,我希望避免将参数复制到过滤列表中的内存.我想在适当的位置过滤它们,但我很确定混淆argv数组本身,或者它指向的任何数据,可能是不可取的.有什么建议?
如何在R中绘制一个非常大的数据集?
我想使用箱形图或小提琴图或类似的.所有数据都无法放入内存中.我可以逐步读入并计算制作这些图所需的摘要吗?如果是这样的话?
您将如何解决以下存储和检索问题?
每天(365天/年)将添加大约2.000.000行,每行包含以下信息:
entity_id与date_id相结合是唯一的.因此,每个实体和日期最多只能有一行添加到表中.数据库必须能够保存10年的每日数据(7.300.000.000行(3.650*2.000.000)).
上面描述的是写模式.读取模式很简单:所有查询都将在特定的entity_id上进行.即检索描述entity_id = 12345的所有行.
不需要事务支持,但存储解决方案必须是开源的.理想情况下我想使用MySQL,但我愿意接受建议.
现在 - 您将如何解决所描述的问题?
更新:我被要求详细说明读写模式.写入表将每天一批完成,新的2M条目将一次性添加.读取将连续进行,每秒读取一次.
今天,当我看到一个数据集,其中最小的文件是48000个字段乘1600行(几个人的单倍型,22号染色体)时,我今天刚刚迈出了我的第一个宝贝步骤进入真正的科学计算.这被认为是微不足道的.
我写Python,所以我花了最后几个小时阅读有关HDF5,Numpy和PyTable的内容,但我仍然觉得我并不是真正想要一个TB级数据集对于我作为程序员的实际意义.
例如,有人指出,对于较大的数据集,不可能将整个内容读入内存,不是因为机器内存不足,而是因为架构的地址空间不足!它让我大吃一惊.
还有什么其他的假设我一直在教室里依赖这个大的投入?我需要做些什么才能开始做或以不同的方式思考?(这不一定是Python特定的.)
我写了一个方法insert(),我试图使用JDBC Batch将50万条记录插入到MySQL数据库中:
public void insert(int nameListId, String[] names) {
String sql = "INSERT INTO name_list_subscribers (name_list_id, name, date_added)"+
" VALUES (?, ?, NOW())";
Connection conn = null;
PreparedStatement ps = null;
try{
conn = getConnection();
ps = conn.prepareStatement(sql);
for(String s : names ){
ps.setInt(1, nameListId);
ps.setString(2, s);
ps.addBatch();
}
ps.executeBatch();
}catch(SQLException e){
throw new RuntimeException(e);
}finally{
closeDbResources(ps, null, conn);
}
}
Run Code Online (Sandbox Code Playgroud)
但每当我尝试运行此方法时,我会收到以下错误:
java.lang.OutOfMemoryError: Java heap space
com.mysql.jdbc.ServerPreparedStatement$BatchedBindValues.<init>(ServerPreparedStatement.java:72)
com.mysql.jdbc.ServerPreparedStatement.addBatch(ServerPreparedStatement.java:330)
org.apache.commons.dbcp.DelegatingPreparedStatement.addBatch(DelegatingPreparedStatement.java:171)
Run Code Online (Sandbox Code Playgroud)
如果我更换ps.addBatch()与ps.executeUpdate()和删除ps.executeBatch(),它工作得很好,但它需要一些时间.如果您知道在这种情况下使用Batch是否合适,请告诉我,如果是,那么为什么会给出OurOfMemoryError? …
我知道如何使用--volumes-from创建数据卷容器并将其挂载到多个其他容器,但我确实有一些关于它的用法和限制的问题:
情况:我希望使用数据卷容器将用户上传的图像存储到我的Web应用程序中.此数据卷容器将由运行Web前端的许多其他容器使用/安装.
问题:
数据量容器可以使用/安装在驻留在docker群中的其他主机上的容器中吗?
性能如何?建议用这种方式构建东西吗?
有没有更好的方法来处理跨容器和主机(如NFS)的持久资源共享?
(最初这是作为方法提示发布的,我的答案包含在问题中.我现在将我的答案分成下面的"答案"部分).
更具体:
假设您正在向用户显示一组记录,分为固定大小的页面(例如,Google搜索的结果).如果只有几页,您可以在结果的末尾显示一个页面导航区域,如下所示:
[<<] [<] 1 2 3 4 5 6 7 8 9 10 11 12 13 [>] [>>]
但如果结果超过20或30页,这很快就变得不合适了.
有时你会看到这样的事情:
[<<] [<] ... 665 666 667 668 669 670 671 672 673 ... [>] [>>]
或这个:
[<<] [<] 1 2 3 ... 667 668 669 670 671 ... 845 846 847 [>] [>>]
但是在这两种情况下,导航到"......"部分中间的任何地方都会需要很多很多的mousclicks.有时会提供用于直接输入页码的输入框; 否则(假设我们在这里谈论一个网页),精明的用户可能会查看URL以查看他们是否可以直接编辑它.
最好的方法是使用分页显示,让用户只需几次鼠标点击就可以访问任何页面,而不会有太多荒谬的链接.
如何最好地实现?
navigation paging user-interface pagination large-data-volumes
mysql ×2
python ×2
r ×2
sql ×2
batch-file ×1
c ×1
database ×1
docker ×1
docker-swarm ×1
hibernate ×1
java ×1
jdbc ×1
large-files ×1
navigation ×1
pagination ×1
paging ×1
plot ×1
web-crawler ×1