2014-08-29 116 views
2

我有大約6000個json.gz文件總計24GB,我需要做各種計算。 因爲我不知道我將從每個JSON文件中選擇的行數(因爲我會拒絕一些行中包含無效數據),所以我估計每個JSON的最大行數爲2000從Memmapped數組中刪除空白行

我創建了一個Memmapped numpy的與陣列形狀(6000*2000,10)並解析來自json.gz數據到Memmapped numpy的[總大小= 2.5GB]

在它原來的端,由於高估的,最後的10- 15%的行都是零。現在,由於我的計算性質,我需要從Memmapped numpy中刪除這些無效行。優先級當然是時間之後內存

什麼可能是最好的方法來做到這一點? 我在編程上意識到要刪除的行的確切索引

  1. 用正確的形狀和大小創建另一個Memmaped陣列,將原始數組切片到此處。
  2. 使用delete()功能
  3. 使用屏蔽
  4. 別的東西嗎?
+0

你能加載到正常NumPy的陣列從一開始就正確的長度,使用np.fromiter(HTTP ://docs.scipy.org/doc/numpy/reference/generated/numpy.fromiter.html)? – 2014-08-29 11:02:26

回答

0

You can use arr.base.resize截斷或放大陣列,然後arr.flush()保存變化到磁盤:

In [169]: N = 10**6 

In [170]: filename = '/tmp/test.dat' 

In [171]: arr = np.memmap(filename, mode='w+', shape=(N,)) 

In [172]: arr.base.resize(N//2) 

In [173]: arr.flush() 

In [174]: arr = np.memmap(filename, mode='r') 

In [175]: arr.shape 
Out[175]: (500000,) 

In [176]: arr.size == N//2 
Out[176]: True