标签: large-data-volumes

设计网络爬虫

我遇到了一个采访问题"如果你正在设计一个网络爬虫,你将如何避免进入无限循环?"我试图回答它.

这一切从一开始就是如何开始的.比如谷歌开始时,一些中心页面上说有数百个(首先如何找到这些中心页面是一个不同的子问题).当Google跟踪来自页面的链接等时,它是否继续制作哈希表以确保它不遵循先前访问过的页面.

如果同一页面有2个名称(URL),如果我们有URL缩短器等,那么该怎么办呢?

我以谷歌为例.虽然谷歌没有泄漏其网络爬虫算法和页面排名等的工作方式,但任何猜测?

search-engine large-data-volumes web-crawler google-search data-structures

69
推荐指数
2
解决办法
4万
查看次数

使用Hibernate的ScrollableResults慢慢读取9000万条记录

我只需要使用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)

由于我有其他条件,即使是索引中的所有条件,它仍然没有我想要的那么快......所以仍然可以提供其他建议..

java mysql hibernate large-data-volumes scrollableresults

52
推荐指数
4
解决办法
8万
查看次数

许多文本文件中的大量数据 - 如何处理?

我有大量的数据(几TB)并累积......它们包含在许多制表符分隔的平面文本文件中(每个大约30MB).大多数任务涉及读取数据并基于一系列谓词语句聚合(求和/平均+附加转换)观察/行,然后将输出保存为文本,HDF5或SQLite文件等.我通常使用R对于这样的任务,但我担心这可能有点大.一些候选解决方案是

  1. 用C(或Fortran)写整个东西
  2. 直接将文件(表)导入关系数据库,然后在R或Python中删除块(某些转换不适用于纯SQL解决方案)
  3. 用Python编写全部内容

(3)是个坏主意吗?我知道你可以在Python中包装C例程,但在这种情况下,因为没有任何计算上的限制(例如,需要许多迭代计算的优化例程),我认为I/O可能与计算本身一样是瓶颈.您对进一步的考虑或建议有什么建议吗?谢谢

编辑感谢您的回复.关于Hadoop的看法似乎存在冲突,但无论如何我都无法访问集群(虽然我可以使用几台未经网络的机器)......

python sql r large-data-volumes large-files

32
推荐指数
3
解决办法
4837
查看次数

是否可以更改argv或是否需要创建它的调整副本?

我的应用程序可能传递了大量的参数,我希望避免将参数复制到过滤列表中的内存.我想在适当的位置过滤它们,但我很确定混淆argv数组本身,或者它指向的任何数据,可能是不可取的.有什么建议?

c large-data-volumes

30
推荐指数
3
解决办法
2万
查看次数

在R中绘制非常大的数据集

如何在R中绘制一个非常大的数据集?

我想使用箱形图或小提琴图或类似的.所有数据都无法放入内存中.我可以逐步读入并计算制作这些图所需的摘要吗?如果是这样的话?

plot r large-data-volumes

26
推荐指数
2
解决办法
1万
查看次数

有效存储7.300.000.000行

您将如何解决以下存储和检索问题?

每天(365天/年)将添加大约2.000.000行,每行包含以下信息:

  • id(唯一行标识符)
  • entity_id(取值介于1和2.000.000之间)
  • date_id(每天增加一个 - 将取1到3.650之间的值(十年:1*365*10))
  • value_1(取值介于1和1.000.000之间)
  • value_2(取值介于1和1.000.000之间)

entity_id与date_id相结合是唯一的.因此,每个实体和日期最多只能有一行添加到表中.数据库必须能够保存10年的每日数据(7.300.000.000行(3.650*2.000.000)).

上面描述的是写模式.读取模式很简单:所有查询都将在特定的entity_id上进行.即检索描述entity_id = 12345的所有行.

不需要事务支持,但存储解决方案必须是开源的.理想情况下我想使用MySQL,但我愿意接受建议.

现在 - 您将如何解决所描述的问题?

更新:我被要求详细说明读写模式.写入表将每天一批完成,新的2M条目将一次性添加.读取将连续进行,每秒读取一次.

mysql sql database large-data-volumes data-warehouse

23
推荐指数
3
解决办法
3949
查看次数

输入为千兆/太字节大小时会发生什么变化?

今天,当我看到一个数据集,其中最小的文件是48000个字段乘1600行(几个人的单倍型,22号染色体)时,我今天刚刚迈出了我的第一个宝贝步骤进入真正的科学计算.这被认为是微不足道的.

我写Python,所以我花了最后几个小时阅读有关HDF5,Numpy和PyTable的内容,但我仍然觉得我并不是真正想要一个TB级数据集对于我作为程序员的实际意义.

例如,有人指出,对于较大的数据集,不可能将整个内容读入内存,不是因为机器内存不足,而是因为架构的地址空间不足!它让我大吃一惊.

还有什么其他的假设我一直在教室里依赖这个大的投入?我需要做些什么才能开始做或以不同的方式思考?(这不一定是Python特定的.)

python large-data-volumes scientific-computing

21
推荐指数
2
解决办法
1699
查看次数

JDBC批量插入OutOfMemoryError

我写了一个方法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? …

jdbc large-data-volumes batch-file out-of-memory

20
推荐指数
2
解决办法
2万
查看次数

Docker数据卷容器 - 我可以在swarm中共享

我知道如何使用--volumes-from创建数据卷容器并将其挂载到多个其他容器,但我确实有一些关于它的用法和限制的问题:

情况:我希望使用数据卷容器将用户上传的图像存储到我的Web应用程序中.此数据卷容器将由运行Web前端的许多其他容器使用/安装.

问题:

  1. 数据量容器可以使用/安装在驻留在docker群中的其他主机上的容器中吗?

  2. 性能如何?建议用这种方式构建东西吗?

  3. 有没有更好的方法来处理跨容器和主机(如NFS)的持久资源共享?

large-data-volumes docker docker-swarm

20
推荐指数
2
解决办法
1万
查看次数

如何为许多页面进行页面导航?对数页面导航

在许多页面上显示页面导航的最佳方法是什么?

(最初这是作为方法提示发布的,我的答案包含在问题中.我现​​在将我的答案分成下面的"答案"部分).


更具体:

假设您正在向用户显示一组记录,分为固定大小的页面(例如,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

16
推荐指数
1
解决办法
2万
查看次数