Java根据词频生成批量数据

1. 背景:首先条件是1200列的4W行数据,先进行各个列字段的词频统计,然后根据这些列的词频给出任意GB的生成数据。


 2. 分析:将各个列的词频信息放在Column.txt中,(Reporting_IsEditorial.txt),这个地方可以有两种方案,(a)根据区间或者上界查找(二分查找);(b)根据初始化的String[]数组。

Reporting_IsEditorial	True	6177
Reporting_IsEditorial	False	33823

其中,在方案a中,定义类对象,存着Value和上界upperBound;方案b中,只需要存着array[]。

(a)List<List<Column>> columnList = new ArrayList();

二维数组,第一维是Column,第二维是各个Column的所有信息(当然在最开始的时候需要读取配置信息)

只要查找上界的方案是二分查找法。

(b)List<ColumnArray> columnList = new ArrayList();

直接存取array数组(在对象ColumnArray),这里主要是初始化消耗时间。

3. 注意:

(1)在写文件的时候,定义StringBuilder来存取一行的数据,节省时间和内存。

(2)在这类中不适合用Map,会消耗时间。

(3)可以采取多线程的方式。

(4)在b方案中,16s生成200M数据,配置信息加载是5s,可以采取。

4. 解决办法:

(a)二分查找

 protected String getValueByBinarySearch(int randNum, List<Column> columnRate) {
        String columnValue = null;
        int lo = 0;
        int hi = columnRate.size() - 1;
        int mid;
        int top;
        Column col, col1;
        while (lo <= hi) {
            mid = (lo + hi) / 2;
            col = columnRate.get(mid);
            top = col.getUpperBound();
            if (mid > 0) {
                col1 = columnRate.get(mid - 1);
                if (top >= randNum && randNum > col1.getUpperBound()) {
                    columnValue = columnRate.get(mid).getValue();
                    return columnValue;
                } else if (top < randNum) {
                    lo = mid + 1;
                } else {
                    hi = mid - 1;
                }
            } else {
                if (top >= randNum && randNum > 0) {
                    columnValue = columnRate.get(mid).getValue();
                    return columnValue;
                } else if (top < randNum) {
                    lo = mid + 1;
                } else {
                    hi = mid - 1;
                }
            }
        }
        columnValue = "search_error";
        System.out.println("Problem is : " + columnValue);
        return columnValue;
    }

(b)设置初始化数组

private void initColumnRate() {
        for (String cName : columnName) {
            initColumnList(cName);
        }
    }

    private void initColumnList(String cName) {
        String columnPath = filePath + "data_dict/" + cName + ".txt";
        String curLine = null;
        BufferedReader br = null;
        String columnsLine[] = null;
        try {
            br = new BufferedReader(new FileReader(columnPath));
            int top = 0, bottom = 0;
            ColumnArray c = new ColumnArray();
            while ((curLine = br.readLine()) != null) {
                // 0: columnName, 1: content, 2: rate(interval)
                columnsLine = curLine.split("\t");
                // 0: columnName, 1: content, 2: rate(interval)
                top += Integer.valueOf(columnsLine[2]);
                for (int i = bottom; i < top; i++)
                    c.getArray()[i] = columnsLine[1];
                bottom = top;
            }
            columnList.add(c);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null)
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值