我有一个设计问题。我有一个3-4 GB的数据文件,按时间戳排序。我想弄清楚处理这个文件的最佳方法是什么。
我正在考虑将整个文件读入内存,然后将这些数据传输到不同的计算机,然后在这些计算机上运行我的分析。
在运行我的分析之前将它上传到数据库是否明智?
我计划在不同的机器上运行我的分析,因此通过数据库进行分析会更容易,但如果我增加机器数量来运行我对数据库的分析可能会变得太慢。
有什么想法吗?
@update:
我想逐个处理记录。基本上尝试在时间戳数据上运行模型,但我有各种模型,所以想要分发它,以便整个过程每天运行一整夜。我想确保我可以轻松增加模型数量而不是降低系统性能。这就是为什么我打算将数据分发到运行该模型的所有机器(每台机器将运行一个模型)。
答案 0 :(得分:2)
您甚至可以访问硬盘本身的文件并一次读取一小块文件。 Java有一个称为随机访问文件的东西,但同样的概念也可用于其他语言。
是否要加载到数据库中并且分析应该完全受要求的约束。如果您可以读取文件并继续处理它,则无需存储在数据库中。但是对于分析,如果您需要来自文件的所有不同区域的数据而不是数据库将是一个好主意。
答案 1 :(得分:1)
在运行我的分析之前将它上传到数据库是否明智?
是
我计划在不同的机器上运行我的分析,因此通过数据库进行分析会更容易,但如果我增加机器数量来运行我对数据库的分析可能会太慢。
不要担心,一切都会好的。只需引入一个标记,即可识别每台计算机处理的行。我不确定我是否完全理解您的所有要求,但如果您需要保留数据(不止一次参考),那么数据库就是可行的方法。如果您只需要处理这些输出文件的一部分并信任结果,则可以在不存储任何内容的情况下即时执行。
仅存储您需要的数据,而不是文件中的所有数据。
答案 2 :(得分:1)
您不需要将整个文件存入内存,只需要分析所需的数据。您可以读取每一行并仅存储该行所需的部分以及该行在文件中开始的索引,因此如果您需要此行中的更多数据,您可以稍后找到它。
答案 3 :(得分:0)
根据所需的分析,这听起来像是使用MapReduce和Hadoop的教科书案例。它将支持您将来添加更多机器的要求。看看Hadoop wiki:http://wiki.apache.org/hadoop/
从概述开始,让独立设置在一台计算机上运行,并尝试对您的文件进行简单分析(例如,以“grep”或其他内容开头)。需要一些装配,但是一旦你配置了东西,我认为它可能是你正确的道路。
答案 4 :(得分:0)
我最近遇到了类似的问题,就像@lalit提到的那样,我使用RandomAccess文件阅读器来查找位于硬盘中的文件。
在我的情况下,我只需要对文件的读访问权,所以我启动了一堆线程,每个线程都从文件的不同点开始,这让我完成了工作,这真的提高了我的吞吐量,因为每个线程在进行一些处理时可能会花费大量时间,同时其他线程可能正在读取文件。
像我提到的那样的程序应该很容易编写,只需尝试一下,看看性能是否符合您的要求。
答案 5 :(得分:0)
@update:
我想逐个处理记录。基本上尝试在时间戳数据上运行模型,但我有各种模型,所以想要分发它,以便整个过程每天运行一整夜。我想确保我可以轻松增加模型数量而不是降低系统性能。这就是为什么我打算将数据分发到运行该模型的所有机器(每台机器将运行一个模型)。