Guest User

Untitled

a guest
Feb 19th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.91 KB | None | 0 0
  1. mm = require(MVC_MODELS);
  2. var Mola = require('mola');
  3. var scale = require('mola/scale');
  4. var path_module = require('path');
  5. var bin = require('util/binary');
  6. var fs = require('fs');
  7. var Gate = require('util/gate');
  8. /**
  9. * the Gate class calls the callback passed to its constructor
  10. * when the number of task_start() calls equals the number of task_done() calls.
  11. * after gate.start() has been called.
  12. * It is used to execute a function asynchronously after a set of
  13. * asynchronous functions have completed.
  14. *
  15. * Sector records contain data about MOLA files that are binary records of MARS topography:
  16. *
  17. FILE_RECORDS = 5632 = sector.rows
  18. RECORD_BYTES = 11520 = sector.bytes = (2 x sector.cols)
  19. *
  20. */
  21.  
  22. function _path(sector) {
  23. return MVC_ROOT + '/scripts/sector_files/' + sector._id + '/' + sector.data_files.data;
  24. }
  25.  
  26.  
  27. module.exports = function(sector, sector_callback) {
  28. console.log(__filename, ': ========== PARSING ROWS OF ========== ', sector);
  29.  
  30. var path = _path(sector);
  31.  
  32. if (!path_module.existsSync(path)) {
  33. throw new Exception('missing data file ', path);
  34. }
  35.  
  36. var self = this;
  37. mm.model('map_sector_rows', function(err, sector_rows_model) {
  38. var sector_row_count = 0;
  39.  
  40. function _save_row_data(sector, ints, sector_row_index, callback) {
  41. var sr_data = {
  42. data: ints,
  43. sector: sector._id,
  44. row: sector_row_index,
  45. length: ints.length,
  46. expected_length: sector.cols
  47. };
  48.  
  49. sector_rows_model.put(sr_data, callback); // puts data above into Mongo
  50. }
  51.  
  52. function _next_chunk() {
  53. if (file_position < sector.rows * row_byte_count) {
  54. setTimeout(_read_chunk, 1000);
  55. } else {
  56. console.log('ALL CHUNKS READ.');
  57. sector.parsed = true;
  58. self.put(sector, function(err, result) {
  59. console.log('parsed ', result);
  60. });
  61. sector_callback();
  62. }
  63. }
  64.  
  65. sector_rows_model.delete({
  66. sector: sector._id
  67. }, function() { // after delete
  68. var file_position = 0; // where in the source file to take a read chunk
  69. var sector_row_index = 0; // the number of rows that have been read
  70. var row_byte_count = sector.bytes; // == 11520
  71. var rows_per_buffer = 8; // why not?
  72. var buffer_size = rows_per_buffer * row_byte_count; // size read in one swipe
  73. // at 11520 bytes == row_byte_count
  74.  
  75. fs.open(path, 'r', function(err, fd) {
  76. var buffer = new Buffer(buffer_size);
  77.  
  78. function _read_chunk() {
  79. console.log('READING CHUNK ', file_position);
  80.  
  81. function _write_buffer() {
  82. console.log('digesting from ', file_position, '(',
  83. file_position/1024, 'k) to ',
  84. file_position + buffer_size, ' (',
  85. (file_position + buffer_size) / 1024, 'k)');
  86. file_position += buffer_size;
  87. for (var buffer_row = 0; buffer_row < rows_per_buffer; ++buffer_row) {
  88. var bytes = _buffer_bytes(buffer, buffer_row, row_byte_count);
  89. var ints = _read_bin_line(buffer, bytes);
  90. if (!(buffer_row % 100)) { console.log('saving buffer row ', buffer_row, '; sector row ', sector_row_index); }
  91. _save_row_data(sector, ints, sector_row_index, gate.task_done_callback(true));
  92. // gate.task_done_callback(true) calls gate.task_start() and passes a function that executes gate.task.done() when called.
  93. ++sector_row_index;
  94. }
  95. console.log('saving last buffer row ', buffer_row, '; sector row ', sector_row_index);
  96. gate.start();
  97. }
  98.  
  99. var gate = new Gate(_next_chunk);
  100. console.log('reading fd, buffer, 0, ', buffer_size, ',', file_position, ', _write_buffer');
  101. fs.read(fd, buffer, 0, buffer_size, file_position, _write_buffer);
  102. } // end _read_chunk;
  103. _read_chunk();
  104. }); // end fs.open
  105. }); // end delete
  106. }) // end mm.model
  107. }
  108.  
  109. function _buffer_bytes(buffer, buffer_row, row_byte_count) {
  110. var start = buffer_row * row_byte_count;
  111. var end = (1 + buffer_row) * row_byte_count;
  112. var bytes = buffer.slice(start, end);
  113. return bytes;
  114. }
  115.  
  116. function _read_bin_line(data) {
  117.  
  118. var l = data.length;
  119. var out = [];
  120.  
  121. for (var offset = 0; offset < l; offset += 2) {
  122. var i = bin.int16(offset, 'big', data); // == buffer.toInt16
  123. out.push(i);
  124. }
  125. return out;
  126. }
Add Comment
Please, Sign In to add comment