我正在用 Java 实现它。
Symbol file Store data file
1\item1 10\storename1
10\item20 15\storename6
11\item6 15\storename9
15\item14 1\storename250
5\item5 1\storename15
用户将使用通配符搜索商店名称,例如 storename?
我的工作是搜索商店名称并使用符号数据生成完整的字符串。例如:
item20-storename1
item14-storename6
item14-storename9
我的做法是:
- 逐行读取存储数据文件
- 如果任何行包含匹配的搜索字符串(如
storename?
),我会将那行推送到中间存储结果文件 - 我还会将匹配的商店名称的 itemno 复制到数组列表中(例如 10,15)
- 当这个 arraylist 大小为 %100==0 时,我将使用 hashset 删除重复项号,显着减少 arraylist 大小
当数组列表大小>1000
- 使用
Collections.sort(itemno_arraylist)
对该列表进行排序 - 打开符号文件并开始逐行阅读
- 对于每一行
Collections.binarySearch(itemno_arraylist,itmeno)
- 如果匹配则将结果推送到中间符号结果文件
- 使用
继续执行步骤 1 直到存储数据文件的 EOF
...
完成所有这些之后,我将组合两个结果文件(符号结果文件和存储结果文件)来呈现实际的字符串列表。
这种方法行之有效,但会消耗更多的 CPU 时间和主内存。
我想知道一个更好的解决方案,它可以减少 CPU 时间(目前为 2 分钟)和内存(目前为 80MB)。 Java 中有许多可用的集合类。对于这种巨大的字符串处理问题,哪一个会给出更有效的解决方案?
如果您对 Java 中的此类字符串处理问题有任何想法,那将是非常有用的。
注意:两个文件的长度都将近一百万行。
最佳答案
将两个平面文件替换为嵌入式数据库(有 plenty of them ,我过去使用 SQLite 和 Db4O):问题解决。
关于java - 如何用更少的内存提高字符串处理的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12995617/