gpt4 book ai didi

java - Android:将数据插入 trie 时读取 txt 文件缓慢和内存泄漏(错误的 hashmap 使用)?

转载 作者:行者123 更新时间:2023-11-29 22:19:21 24 4
gpt4 key购买 nike

我正在尝试在我的 Android 应用程序中读取一个 816 KB 的 txt 文件(70 000 行),该文件包含在 res/raw 文件夹中。这是相关的代码 fragment :

            InputStream raw = context.getResources().openRawResource(R.raw.alpha);
InputStreamReader inputreader = new InputStreamReader(raw);
BufferedReader r = new BufferedReader(inputreader);
String line;

int j = 0;
while ((line = r.readLine()) != null && j < 90000){
theTrie.insert(line);
j++;
}

“上下文”通过参数给出:Main.readDatabase(getApplication());

此版本崩溃并显示以下日志:

10-04 21:14:26.096: INFO/dalvikvm(1327):   | group="main" sCount=0 dsCount=0 obj=0x4001f1a8 self=0xce48
10-04 21:14:26.096: INFO/dalvikvm(1327): | sysTid=1327 nice=0 sched=0/0 cgrp=default handle=-1345006528
10-04 21:14:26.096: INFO/dalvikvm(1327): | schedstat=( 3112456663 436561269 431 )
10-04 21:14:26.096: INFO/dalvikvm(1327): at java.lang.Throwable.nativeFillInStackTrace(Native Method)
10-04 21:14:26.096: INFO/dalvikvm(1327): at java.lang.Throwable.fillInStackTrace(Throwable.java:135)
10-04 21:14:26.096: INFO/dalvikvm(1327): at java.lang.Throwable.<init>(Throwable.java:74)
10-04 21:14:26.106: INFO/dalvikvm(1327): at java.lang.Error.<init>(Error.java:38)
10-04 21:14:26.106: INFO/dalvikvm(1327): at java.lang.VirtualMachineError.<init>(VirtualMachineError.java:36)
10-04 21:14:26.106: INFO/dalvikvm(1327): at java.lang.OutOfMemoryError.<init>(OutOfMemoryError.java:34)
10-04 21:14:26.106: INFO/dalvikvm(1327): at java.util.HashMap.makeTable(HashMap.java:-1)
10-04 21:14:26.106: INFO/dalvikvm(1327): at java.util.HashMap.<init>(HashMap.java:162)
10-04 21:14:26.106: INFO/dalvikvm(1327): at snappy.keyboard.TrieNode.<init>(TrieNode.java:21)
10-04 21:14:26.106: INFO/dalvikvm(1327): at snappy.keyboard.Trie.insert(Trie.java:27)
10-04 21:14:26.106: INFO/dalvikvm(1327): at snappy.keyboard.Main.readDatabase(Main.java:356)
10-04 21:14:26.106: INFO/dalvikvm(1327): at snappy.keyboard.SoftKeyboard.onCreate(SoftKeyboard.java:89)
10-04 21:14:26.106: INFO/dalvikvm(1327): at android.app.ActivityThread.handleCreateService(ActivityThread.java:1920)
10-04 21:14:26.106: INFO/dalvikvm(1327): at android.app.ActivityThread.access$2500(ActivityThread.java:117)
10-04 21:14:26.106: INFO/dalvikvm(1327): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:982)
10-04 21:14:26.106: INFO/dalvikvm(1327): at android.os.Handler.dispatchMessage(Handler.java:99)
10-04 21:14:26.106: INFO/dalvikvm(1327): at android.os.Looper.loop(Looper.java:123)
10-04 21:14:26.106: INFO/dalvikvm(1327): at android.app.ActivityThread.main(ActivityThread.java:3647)
10-04 21:14:26.106: INFO/dalvikvm(1327): at java.lang.reflect.Method.invokeNative(Native Method)
10-04 21:14:26.106: INFO/dalvikvm(1327): at java.lang.reflect.Method.invoke(Method.java:507)
10-04 21:14:26.106: INFO/dalvikvm(1327): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
10-04 21:14:26.106: INFO/dalvikvm(1327): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
10-04 21:14:26.106: INFO/dalvikvm(1327): at dalvik.system.NativeStart.main(Native Method)
10-04 21:14:26.196: WARN/dalvikvm(1327): Exception thrown (Ljava/lang/OutOfMemoryError;) while throwing internal exception (Ljava/lang/OutOfMemoryError;)
10-04 21:14:26.326: INFO/dalvikvm-heap(1327): Clamp target GC heap from 25.881MB to 24.000MB
10-04 21:14:26.326: DEBUG/dalvikvm(1327): GC_CONCURRENT freed <1K, 13% free 20224K/22983K, external 1625K/2137K, paused 2ms+3ms
10-04 21:14:26.446: INFO/dalvikvm-heap(1327): Clamp target GC heap from 25.856MB to 24.000MB
10-04 21:14:26.446: DEBUG/dalvikvm(1327): GC_FOR_MALLOC freed 25K, 13% free 20198K/22983K, external 1625K/2137K, paused 123ms
10-04 21:14:26.446: DEBUG/AndroidRuntime(1327): Shutting down VM

如果我不在模拟器中运行此代码(由于文件读取而略有更改),但在普通的 Java 应用程序中它运行良好,没有任何问题,但在 Android 上似乎存在内存泄漏?有人知道可能是什么问题吗?即使我删除了行“theTrie.insert(line);”因此 while 循环(几乎)是空的,应用程序需要 2.1 秒来“读取”800 kb。这不可能是正常的,对吧?我的错误在哪里?

提前致谢!

更新:我用 DDMS 转储了一个堆文件并用 MAT 分析了它。它说: [有问题的] 类由“dalvik.system.PathClassLoader @ 0x4051d5e8”加载,占用 23.951.808 (91,76%) 字节。内存累积在“”加载的“java.util.HashMap$HashMapEntry[]”的一个实例中。直方图将 java.util.HashMap$HashMapEntry[]、java.util.HashMap 和 java.util.HashMap$HashMapEntry 列为浅堆最大的三个对象。

这是我关于 hashmap 使用的代码(在定义 trie 节点的类中):

public Map<Character, TrieNode> children;

public TrieNode(char letter) {
this.letter = letter;
children = new HashMap<Character, TrieNode>(26);
}

是什么导致了内存泄漏?

最佳答案

有时模拟器没有我们想要的那么准确。有时在终端中运行良好的某些进程在模拟器中运行缓慢。

用安卓手机试一试,然后别忘了告诉我们你的体验。

-------------------------------------------- 修改

试试这个:

        BufferedReader r = new BufferedReader(new InputStreamReader(context.getResources().openRawResource(R.raw.alpha)));
String line = null;

int j = 0;
while ((line = r.readLine()) != null && j < 90000){
theTrie.insert(line);
j++;
}

然后看看你调用了多少次这个函数,也许就是这个问题。

但是,考虑并查看 trie map ,我可以告诉你也对你正在阅读的内容进行投资,也许行太长了

-------------------------------------------- 修改2

我认为你能做的最好的就是改变观点并尝试使用 SQLite 数据库来获得如此多的信息并且没有内存问题。

关于java - Android:将数据插入 trie 时读取 txt 文件缓慢和内存泄漏(错误的 hashmap 使用)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7654257/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com