小编PB_*_*MLT的帖子

14
推荐指数
2
解决办法
9565
查看次数

减少C#应用程序的内存占用

我正在开发一个C#应用程序,需要处理大约4,000,000个英语句子.所有这些句子都存储在树中.树中的每个节点都是具有以下字段的类:

class TreeNode
{
    protected string word;
    protected Dictionary<string, TreeNode> children;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是当应用程序达到第2,000,000个句子时,它正在耗尽所有RAM(我有2 GB RAM).所以它只能设法处理一半的句子,然后它会大幅减速.

我该怎么做才能尝试减少应用程序的内存占用?

编辑:让我解释一下我的申请.所以我有大约300,000个英语句子,从每个句子我生成更多这样的子句:

示例:句子:足球是一种非常受欢迎的运动子句我需要:

  1. 足球是一项非常受欢迎的运动
  2. 是一项非常受欢迎的运动
  3. 一项非常受欢迎的运动
  4. 很受欢迎的运动
  5. 流行的运动
  6. 运动

每个句子逐字存储在树中.因此,考虑到上面的示例,我有一个带有字段="Football"的TreeNode类,子列表具有单词"is"的TreeNode."是"节点的子节点是"a"节点."a"节点的子节点是"非常"节点.我需要逐字存储句子,因为我需要能够搜索所有以例句开头的句子:"足球是".

因此,基本上对于句子中的每个单词,我创建一个新的(子句).这就是我最终得到4,000,000个不同句子的原因.将数据存储在数据库中不是一种选择,因为应用程序需要立即处理整个结构.如果我不得不将所有数据写入数据库,它将进一步减慢进程.

谢谢

c# memory-management

9
推荐指数
1
解决办法
3050
查看次数

如果包含元素被修改,Java HashSet包含重复项

假设您有一个类,并且您创建了一个可以存储此类实例的HashSet.如果您尝试添加相同的实例,则集合中只保留一个实例,这很好.

但是,如果在HashSet中有两个不同的实例,并且您获取一个并使其成为另一个的精确副本(通过复制字段),则HashSet将包含两个重复的实例.

以下代码演示了这一点:

 public static void main(String[] args)
    {
         HashSet<GraphEdge> set = new HashSet<>();
        GraphEdge edge1 = new GraphEdge(1, "a");
        GraphEdge edge2 = new GraphEdge(2, "b");
        GraphEdge edge3 = new GraphEdge(3, "c");

        set.add(edge1);
        set.add(edge2);
        set.add(edge3);

        edge2.setId(1);
        edge2.setName("a");

        for(GraphEdge edge: set)
        {
            System.out.println(edge.toString());
        }

        if(edge2.equals(edge1))
        {
            System.out.println("Equals");
        }
        else
        {
            System.out.println("Not Equals");
        }
    }

    public class GraphEdge
    {
        private int id;
        private String name;

        //Constructor ...

        //Getters & Setters...

        public int hashCode()
        {
        int hash = 7;
        hash = 47 * …
Run Code Online (Sandbox Code Playgroud)

java duplicates hashset

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

如何使用可运行的jar文件执行多线程解决Java问题?

我开发了一个Java Swing应用程序,它使用SwingWorker类来执行一些长时间运行的任务.当应用程序从IDE(Netbeans)运行时,我可以同时启动多个长时间运行的任务而没有任何问题.

我为应用程序创建了一个可运行的jar文件,以便能够从IDE外部运行它.从这个jar文件运行时的应用程序运行良好,唯一的例外是它不允许我同时启动2个长时间运行的任务.任务只是一个接一个地运行.

我设法创建了一个非常简单的程序来演示这个问题.link 该程序使用一个swingworker,它从1到100循环,并将数字写入控制台.这两个按钮启动两个执行相同操作的线程.如果我在netbeans上运行这个程序,线程交错,而如果我创建一个jar文件并从jar文件运行应用程序,线程不会交错,而是一个接一个地运行.

当从jar文件运行应用程序时,似乎jvm在任何时候都不允许运行多个线程.

以下是您遇到链接问题的代码

package testingjarpath;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

public class Main extends JFrame {
    private JButton btnTest;
    private JButton btnTest2;

    public Main() {

        this.btnTest = new JButton("Test 1");
        this.btnTest.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                new Main.MyTask("First").execute();
            }
        });

        this.btnTest2 = new JButton("Test 2");
        this.btnTest2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                new Main.MyTask("Second").execute();
            }
        });

        this.setLayout(new FlowLayout());
        this.add(this.btnTest); …
Run Code Online (Sandbox Code Playgroud)

java multithreading

7
推荐指数
1
解决办法
2108
查看次数

如何使按钮与文本大小完全相同?

是否有可能JButton完全采用其文本的大小?因为默认情况下,a JButton将在其文本周围有少量填充(水平和垂直).我想删除那个填充.

java swing jbutton

6
推荐指数
2
解决办法
9065
查看次数

C#多色文本在datagridview的单个单元格中

是否可以更改datagridview单元格中存在的子字符串的颜色?

.net c# datagridview colors winforms

5
推荐指数
1
解决办法
2037
查看次数

在RAM中加载C#类代码?

我想知道当你实例化类时,C#类的实际代码是否被加载到RAM中?

因此,例如,如果我有2个类CLASS A,CLASS B,其中A类有10000行代码,但只有1个字段,一个int.B类有10行代码,1个字段也有int.如果我实例化A类,由于其代码行,它将占用比B类更多的RAM?

一个补充问题,如果代码行与类一起加载到内存中,它们是否会为类的每个实例加载?或者只为所有实例一次?

提前致谢.

c# memory-management

4
推荐指数
1
解决办法
1071
查看次数