如何使代码更高效?循环和大数据

ugmeyewa  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(362)

我几个月前刚学会编写代码,但我的项目实际上是非常沉重的,我已经知道,任何帮助使这段代码运行更有效将不胜感激。
我想做的是提高代码的效率,因为处理一个30MB的文件需要20个小时,而我想处理一个6.5GB的文件。我需要它在30分钟内处理文件。。。有可能吗?
我在代码中所做的是:
我提取一个单词并检查它的id是否存储在hashmap中
我得到这个词的所有父词,并将它们添加到一个列表中
在列表上的每一项中,我都会得到id和单词以及其他家长
我创建一个节点并将其添加到hashmap中
然后继续下一个词
p、 我不知道如何做hadoopmapreduce代码,我知道这是显而易见的解决方案。。。但是我没有时间去学习。
更新[正如您在屏幕截图中看到的,99.7%的时间用于从wordnet字典“获取”单词的示例,这是我正在使用的库:extjwnl。”getresourceinstance“是调用字典本身的方法,第三个突出显示的条目是调用这些方法的my方法(只有0.001%的时间是由方法的其余部分实际花费的)
我不确定这个问题是否可以解决,或者你有什么想法吗单击此“1”查看屏幕截图]1

static HashMap<Long, Node> graph = new HashMap <Long, Node> ();

    private static void demonstrateTree (IndexWord word) throws JWNLException {

        Long Os = word.getSenses().get(0).getOffset();

        if (graph.containsKey(Os)) {
            return;
        }

        PointerTargetTree hypernyms = PointerUtils.getHypernymTree(word.getSenses().get(0));
        List<PointerTargetNodeList> hypernymsList = hypernyms.toList();

        for(int c=0;c<hypernymsList.size();c++){

            PointerTargetNodeList l = hypernymsList.get(c);

            for(int j = l.size()-1; j >= 0 ; j--) {

                Long tempid = l.get(j).getPointerTarget().getSynset().getOffset();
                String tempword = l.get(j).getPointerTarget().getSynset().getWords().get(0).getLemma();
                Node n = new Node(tempid, tempword, new ArrayList<Node>());

                if (!graph.containsKey(tempid)) {

                    n.id = tempid;
                    n.word = tempword;

                    if (!(j == l.size()-1)){
                        n.parents.add(graph.get(l.get(j+1).getPointerTarget().getSynset().getOffset()));
                    }
                    graph.put(tempid, n);
                }       
            }
        }
    }

    public static void demonstrateListHelper(String text) throws JWNLException {

        String lineText =text.split("\t")[2];
        String [] singleWord = lineText.split("\\s+");
        for (int k=0; k <singleWord.length; k++){

            singleWord[k] = singleWord[k].replaceAll("[^\\w]", "");
            IndexWordSet set = Dictionary.getDefaultResourceInstance().lookupAllIndexWords(singleWord[k]);

            for (IndexWord word:set.getIndexWordArray()) {
                demonstrateTree(word);
            }
        }   
    }

    public static void generateHierarchy() {

        Set<Entry<Long, Node>> iterator = graph.entrySet();
        int i =0;
        for(Entry<Long,Node> e : iterator) {
            System.out.println(i++ +" - " +e.getValue().firstParents());
        }
    }

    @SuppressWarnings({ "resource" })
    public static void main(String[] args) throws JWNLException {
        File file = new File("C:/Users/D060891/Desktop/Thesis/sentencesNYT/part-m-00001");

        try {

            BufferedReader input = new BufferedReader(new FileReader(file));
            String line;

            while ((line = input.readLine()) != null) {
                demonstrateListHelper(line);                              
            }
            generateHierarchy();
        }

        catch (IOException e) {
            e.printStackTrace();
        }
    }
djmepvbi

djmepvbi1#

性能优化的第一条规则是不要盯着代码或猜测,而是测量运行时行为。因此,启动一个探查器,看看你的程序在哪里花费时间(或内存)。
一个好的开始是使用jdk中包含的visualvm分析代码。
更新:您现在已经确定了瓶颈:

Dictionary.getDefaultResourceInstance()

通过查看源代码,每次调用该方法时,都会从xml文档加载wordnet字典。因此,只需将瓶颈移出循环,并在开始时获取字典一次:定义一个类变量

private static Dictionary dictionary;

在开始时初始化,例如在main中

dictionary = Dictionary.getDefaultResourceInstance();

以后再使用

dictionary.lookupAllIndexWords(singleWord[k]);

相关问题