我正在开发一个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个英语句子,从每个句子我生成更多这样的子句:
示例:句子:足球是一种非常受欢迎的运动子句我需要:
每个句子逐字存储在树中.因此,考虑到上面的示例,我有一个带有字段="Football"的TreeNode类,子列表具有单词"is"的TreeNode."是"节点的子节点是"a"节点."a"节点的子节点是"非常"节点.我需要逐字存储句子,因为我需要能够搜索所有以例句开头的句子:"足球是".
因此,基本上对于句子中的每个单词,我创建一个新的(子句).这就是我最终得到4,000,000个不同句子的原因.将数据存储在数据库中不是一种选择,因为应用程序需要立即处理整个结构.如果我不得不将所有数据写入数据库,它将进一步减慢进程.
谢谢
假设您有一个类,并且您创建了一个可以存储此类实例的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 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) 是否有可能JButton完全采用其文本的大小?因为默认情况下,a JButton将在其文本周围有少量填充(水平和垂直).我想删除那个填充.
是否可以更改datagridview单元格中存在的子字符串的颜色?
我想知道当你实例化类时,C#类的实际代码是否被加载到RAM中?
因此,例如,如果我有2个类CLASS A,CLASS B,其中A类有10000行代码,但只有1个字段,一个int.B类有10行代码,1个字段也有int.如果我实例化A类,由于其代码行,它将占用比B类更多的RAM?
一个补充问题,如果代码行与类一起加载到内存中,它们是否会为类的每个实例加载?或者只为所有实例一次?
提前致谢.
java ×4
c# ×3
.net ×1
colors ×1
datagridview ×1
duplicates ×1
hashset ×1
jbutton ×1
screen ×1
swing ×1
web-search ×1
winforms ×1