优化Java中的大数据文件读取

时间:2012-03-08 14:30:42

标签: java optimization large-data

我正在编写一份应用程序来帮助改进论文的机器翻译。为此,我需要大量的ngram数据。我从谷歌获得了数据,但它的格式不是很有用。

以下是Google的数据格式:

ngram TAB year TAB match_count TAB page_count TAB volume_count NEWLINE

这是我之后的事情:

ngram total_match_count_for_all_years

因此,我编写了一个小应用程序来运行这些文件并提取ngrams并在多年内汇总数据以获得总计数。它似乎运行良好。但是,由于Google文件太大(每个1.5GB!其中99个>。<。)它需要很长时间才能完成所有这些。

以下是代码:

public class mergeData
{
    private static List<String> storedNgrams    = new ArrayList<String>(100001);
    private static List<String> storedParts     = new ArrayList<String>(100001);
    private static List<String> toWritePairs    = new ArrayList<String>(100001);
    private static int          rows            = 0;
    private static int          totalFreq       = 0;

    public static void main(String[] args) throws Exception
        {
            File bigram = new File("data01");
            BufferedReader in = new BufferedReader(new FileReader(bigram));
            File myFile = new File("newData.txt");
            Writer out = new BufferedWriter(new FileWriter(myFile));
            while (true)      
                {
                    rows = 0;
                    merge(in, out);
                }
        }

    public static void merge(BufferedReader in, Writer out) throws IOException
        {

            while (rows != 1000000)
                {
                    storedNgrams.add(in.readLine());
                    rows++;
                }

            while (!(storedNgrams.isEmpty()))
                {

                    storedParts.addAll(new ArrayList<String>(Arrays.asList(storedNgrams.get(0).split("\\s"))));

                    storedNgrams.remove(0);

                }
            while (storedParts.size() >= 8)
                {
                    System.out.println(storedParts.get(0) + " " + storedParts.get(1) + " " + storedParts.get(6)
                            + " " + storedParts.get(7));
                    if (toWritePairs.size() == 0 && storedParts.get(0).equals(storedParts.get(6))
                            && storedParts.get(1).equals(storedParts.get(7)))
                        {

                            totalFreq = Integer.parseInt(storedParts.get(3)) + Integer.parseInt(storedParts.get(9));

                            toWritePairs.add(storedParts.get(0));
                            toWritePairs.add(storedParts.get(1));

                            toWritePairs.add(Integer.toString(totalFreq));
                            storedParts.subList(0, 11).clear();

                        }
                    else if (!(toWritePairs.isEmpty()) && storedParts.get(0).equals(toWritePairs.get(0))
                            && storedParts.get(1).equals(toWritePairs.get(1)))
                        {

                            int totalFreq = Integer.parseInt(storedParts.get(3))
                                    + Integer.parseInt(toWritePairs.get(2));

                            toWritePairs.remove(2);
                            toWritePairs.add(Integer.toString(totalFreq));
                            storedParts.subList(0, 5).clear();
                        }
                    else if ((!toWritePairs.isEmpty())
                            && !(storedParts.get(0).equals(storedParts.get(6)) && storedParts.get(1).equals(
                                    storedParts.get(7))))
                        {
                            toWritePairs.add(storedParts.get(0));
                            toWritePairs.add(storedParts.get(1));
                            toWritePairs.add(storedParts.get(2));
                            storedParts.subList(0, 2).clear();
                        }

                    else if (!(toWritePairs.isEmpty()))
                        {
                            out.append(toWritePairs.get(0) + " " + toWritePairs.get(1) + " " + toWritePairs.get(2)
                                    + "\n");
                            toWritePairs.subList(0, 2).clear();

                        }

                    out.flush();
                }
        }

}

如果有人有任何想法如何提高这些文件的处理速度,那将对我有很大的帮助。

2 个答案:

答案 0 :(得分:2)

在数据库中创建临时表。使用文件中的行填充它。必要时创建索引,让数据库进行分组。它将简化程序的逻辑,并且最有可能执行得更快。

答案 1 :(得分:1)

我建议您随时处理数据,而不是读取大量数据并在以后处理。从您的程序中不清楚您尝试提取/聚合的信息。

即使在快速机器上,我预计每个文件大约需要20秒。