プログラマーになりたい。

プログラミングや写真や本や読書会のことや、日常のこと。

対大データに徒手空拳…

DBCLS2回目。辞令を拝命(拝命でいいのかな?)。
次回までのTODO: シャチハタ用意、通勤区間・距離・手段要調査。

kazusa…

(便所先生の領域。わざわざ手を出するだけの強力なアルゴリズムは、思い当たる節が無い…。)

PubMed内でインパクトファクタ的な

  • インパクトファクター」は通常過去2年分と当年分の間で、雑誌単位で計算するものらしい:
  • IF_k = \frac{(cited this year)_k}{(all papers last year)_k+(all papers year before last)_k} k \in (all journals)みたいな。

インパクトファクターは Web of Science の収録雑誌の3年分のデータを用いて計算される。たとえばある雑誌の2004年のインパクトファクターは2002年と2003年の論文数、2004年のその雑誌の被引用回数から次のように求める。
A = 対象の雑誌が2002年に掲載した論文数
B = 対象の雑誌が2003年に掲載した論文数
C = 対象の雑誌が2002年・2003年に掲載した論文が、2004年に引用された延べ回数
C÷(A+B) = 2004年のインパクトファクター


ちなみにpubmed内でもつい最近まで、cites情報は、本文に次ぐ非公開情報だったらしい。
で、そのpubmedメタデータxmlファイル群はダウンロードしないでもdbclsにある。
ただしファイル名の下3桁が617までは完全版で、以降は不備の可能性がある暫定版。


で、各xmlファイルの内容は…とか教えていただいてたら、@yag_aysさんがrubyでパースしてCSVに変換するプログラムを以前書いていたと。ラッキー。
CommentsCorrectionsのうち、refType="Cites"のものだけを取り出すようにとコメントをいただいたが、さらに、それもyagさんが書き換えにつきあって下さったのでラッキー(?)。感謝。
(あれ、おれ、なにもしてないんじゃね?)


で、とりあえず、計算が4時間かかる予定なので、とりあえず現在得られた分まででなにかやるかという。
ちなみに得られるcsv

この論文のPMID,引用論文のPMID1,引用論文のPMID2…
…

の形式。


あ、

この論文のPMID,引用論文のPMID1
この論文のPMID,引用論文のPMID2
…

にしとけばよかったかな…。


げ、もう16,395m390 Bytes = 15.6MBになっている。
が、これでもRで読み込むと結構時間がかかる。
> read.csv("Desktop/medline.csv",FALSE)
CSVの各行の長さは一定ではないので空だとNA値が入る。NAはis.na()でないと調べられない。


しかし、これを隣接行列に展開して…とか何も考えずにやると大変なことになる。(おそらく)スパースではあるが、ともかく添字がでかい。隣接行列に展開すると容量O(n^2)なので、library(bigmemory)のbig.matrixでも足りない(abortした。big.matrix()はメモリ上で非圧縮なようだ)。


つうか、これ、SQLiteとかkey-value strage(いじったことないけど)にすべき規模かもしれない。


と、いうわけで、だったらPHPにしようかなと。CakePHPをおとしてきた。

追記: Rに未練があったので。

個人的にLLで数値計算というのはいまいち馴染めないので、Rで、SQLiteやファイルに保存しつつ処理する方法を調べた。
1. R.huge(非推奨…):

Package ‘R.huge’:
THIS PACKAGE HAS BEEN DEPRECATED. Do not start building new projects based on it. Cross-platform alternatives are the following packages: bigmemory (CRAN), ff (CRAN), BufferedMatrix (BioConductor).


2. sqlite.data.frame {SQLiteDF} / SQLite Data Frame:
http://cran.md.tsukuba.ac.jp/web/packages/RSQLite/

> install.packages("DBI")
…
> install.packages("SQLiteDF")
…
> library(SQLiteDF)
 要求されたパッケージ DBI をロード中です 
> 


3. ff: memory-efficient storage of large data on disk and fast access functions:

The ff package provides data structures that are stored on disk but behave (almost) as if they were in RAM by transparently mapping only a section (pagesize) in main memory

http://cran.md.tsukuba.ac.jp/web/packages/ff/

> install.packages("ff")
also installing the dependency ‘bit’
…
> library(ff)
…
> 


4. BufferedMatrix:
http://www.bioconductor.org/packages/2.4/bioc/html/BufferedMatrix.html
全体に対してMax(X)、Min(X)、mean(X)、Sum(X)、Var(X)、Sd(X)、および行・列に対してrowSums(X)、colSums(X)ができる。ただしColMode()、RolMode()の指定があるらしい。(バッファ出し入れ操作の解説読むのがめんどくさい…。)


ちなみに、(欠番があるが)CSVデータは最終的に224.1952MBに。

$ wc medline.csv 
 1111089 1111089 235085725 medline.csv

この形式のまま計算できるならオンメモリでもいけるだろう。
が、行列演算に相当する計算をどうやろうか、ぱっと浮かばない…。「スパース」とか「行列圧縮」とか、いままで無視しきってやってきたツケが回ってきた感じ…。

Creative Commons License ©2007-2021 IIDA Munenori.