回答編集履歴

3

データ分析コードを追記

2018/11/19 01:59

投稿

can110
can110

スコア38256

test CHANGED
@@ -100,6 +100,12 @@
100
100
 
101
101
 
102
102
 
103
+ テストデータでの検証結果
104
+
105
+ ---
106
+
107
+
108
+
103
109
  以下、行数2千万、名称種類30万、コード種類20万で試した結果です。
104
110
 
105
111
  Corei7搭載機で約5分。まあ我慢できるレベルかと。
@@ -154,6 +160,12 @@
154
160
 
155
161
 
156
162
 
163
+ テストデータ作成コード
164
+
165
+ ---
166
+
167
+
168
+
157
169
  なお、サンプルデータは以下のコードで作成しました。
158
170
 
159
171
  ```Python
@@ -193,3 +205,105 @@
193
205
  print(ROW,NAME,CODE)
194
206
 
195
207
  ```
208
+
209
+
210
+
211
+ データ分析コード
212
+
213
+ ---
214
+
215
+
216
+
217
+ ついでに、データファイルの分析をおこなうコードを作成しました。
218
+
219
+ 行数や名称,コード(種類)数、名称,コード文字長の最小、最大、平均を出力します。
220
+
221
+ ```Python
222
+
223
+ # データの分析
224
+
225
+
226
+
227
+ # 文字列の最小、最大、合計を保持
228
+
229
+ def get_len_info( s, mm):
230
+
231
+ s_len = len(s)
232
+
233
+ mm[2] += s_len
234
+
235
+
236
+
237
+ if s_len < mm[0]:
238
+
239
+ mm[0] = s_len
240
+
241
+ if s_len > mm[1]:
242
+
243
+ mm[1] = s_len
244
+
245
+
246
+
247
+ # 行 0=名称, 1=コード
248
+
249
+ # 列 0=最小, 1=最大, 2=合計
250
+
251
+ len_info = [[99999,-1,0],[99999,-1,0]]
252
+
253
+
254
+
255
+ row_cnt,name_set,code_set = 0,set(),set()
256
+
257
+ with open('data.csv','r') as f:
258
+
259
+ line = f.readline().strip()
260
+
261
+ while line:
262
+
263
+ line = line.split()
264
+
265
+ name,code = line[0],line[1]
266
+
267
+ line = f.readline().strip()
268
+
269
+
270
+
271
+ name_set.add(name)
272
+
273
+ code_set.add(code)
274
+
275
+
276
+
277
+ # 文字列長の最小、最大、合計を保持
278
+
279
+ get_len_info(name,len_info[0])
280
+
281
+ get_len_info(code,len_info[1])
282
+
283
+
284
+
285
+ row_cnt += 1
286
+
287
+
288
+
289
+ name_cnt,code_cnt = len(name_set),len(code_set)
290
+
291
+
292
+
293
+ print('行数[{}] 名称(種類)数[{}] コード(種類)数[{}]'.format(row_cnt,name_cnt,code_cnt))
294
+
295
+ print('名称長 最小[{:.0f}] 最大[{:.0f}] 平均[{:.2f}]'.format( len_info[0][0], len_info[0][1], len_info[0][2]/row_cnt))
296
+
297
+ print('コド長 最小[{:.0f}] 最大[{:.0f}] 平均[{:.2f}]'.format( len_info[1][0], len_info[1][1], len_info[1][2]/row_cnt))
298
+
299
+ """
300
+
301
+ 行数[19996722] 名称(種類)数[300000] コード(種類)数[200000]
302
+
303
+ 名称長 最小[5] 最大[10] 平均[9.63]
304
+
305
+ コド長 最小[5] 最大[10] 平均[9.44]
306
+
307
+ """
308
+
309
+ ```

2

コード追記

2018/11/19 01:59

投稿

can110
can110

スコア38256

test CHANGED
@@ -5,6 +5,98 @@
5
5
  提示されているりんご~豆のテストデータにて結果は正しかったので、自信ありませんが大丈夫と思います。多分。
6
6
 
7
7
  ポイントとしては、行毎にファイルを読み込むことでメモリを節約しています。
8
+
9
+
10
+
11
+ ```Python
12
+
13
+ import time
14
+
15
+ # コード、名称毎に数え上げ
16
+
17
+
18
+
19
+ dic_cnt = {}# コード毎、名称毎に個数を保持する2重辞書
20
+
21
+ # {コード:{名称:個数, ...}, ...}
22
+
23
+ prev = time.time()
24
+
25
+ with open('data.csv','r') as f:
26
+
27
+ line = f.readline().strip()
28
+
29
+ while line:
30
+
31
+ line = line.split()
32
+
33
+ name,code = line[0],line[1]
34
+
35
+ line = f.readline().strip()
36
+
37
+
38
+
39
+ # 始めて出現したコード -> 登録
40
+
41
+ if code not in dic_cnt:
42
+
43
+ dic_cnt[code] = {}
44
+
45
+
46
+
47
+ # 初めて出現した名称 -> 登録
48
+
49
+ if name not in dic_cnt[code]:
50
+
51
+ dic_cnt[code][name] = 0
52
+
53
+
54
+
55
+ # 既存の名前の個数をインクリメント
56
+
57
+ for name,count in dic_cnt[code].items():
58
+
59
+ dic_cnt[code][name] += 1
60
+
61
+
62
+
63
+ print('counting done.{:.2f}sec'.format(time.time()-prev))
64
+
65
+ prev = time.time()
66
+
67
+
68
+
69
+ # 名称毎に集計
70
+
71
+ dic_ret = {}
72
+
73
+ for v in dic_cnt.values():
74
+
75
+ for name,cnt in v.items():
76
+
77
+ if name not in dic_ret:
78
+
79
+ dic_ret[name] = 0
80
+
81
+ dic_ret[name] += cnt
82
+
83
+
84
+
85
+ # 結果ファイル出力
86
+
87
+ with open('ret.csv','w') as f:
88
+
89
+ for name,cnt in dic_ret.items():
90
+
91
+ f.write('{} {}\n'.format(name,cnt))
92
+
93
+
94
+
95
+ print('sum up done.{:.2f}sec'.format(time.time()-prev))
96
+
97
+ prev = time.time()
98
+
99
+ ```
8
100
 
9
101
 
10
102
 

1

修正

2018/11/18 14:40

投稿

can110
can110

スコア38256

test CHANGED
@@ -18,9 +18,9 @@
18
18
 
19
19
 
20
20
 
21
- 実行結果
21
+ 以下、実行結果
22
22
 
23
- ```PlainText
23
+ ```
24
24
 
25
25
  counting done.310.84sec
26
26
 
@@ -30,9 +30,9 @@
30
30
 
31
31
 
32
32
 
33
- data.csv
33
+ 以下、入力データ data.csv 約420MB
34
34
 
35
- ```PlainText
35
+ ```
36
36
 
37
37
  name27454 code70170
38
38
 
@@ -46,9 +46,9 @@
46
46
 
47
47
 
48
48
 
49
- ret.csv
49
+ 以下、結果データ ret.csv 約5MB
50
50
 
51
- ```PlainText
51
+ ```
52
52
 
53
53
  name210822 4235
54
54